Saya memiliki sesuatu di sini yang benar-benar membuat saya lengah.
Saya memiliki ObservableCollection of T yang diisi dengan item. Saya juga memiliki penangan peristiwa yang dilampirkan ke acara CollectionChanged.
Ketika Anda Hapus koleksi itu menyebabkan sebuah acara CollectionChanged dengan e.Action set untuk NotifyCollectionChangedAction.Reset. Oke, itu normal. Tapi yang aneh adalah tidak ada e.OldItems atau e.NewItems yang memiliki apa pun di dalamnya. Saya berharap e.OldItems diisi dengan semua item yang dihapus dari koleksi.
Apakah ada orang lain yang melihat ini? Dan jika ya, bagaimana mereka bisa mengatasinya?
Beberapa latar belakang: Saya menggunakan acara CollectionChanged untuk melampirkan dan melepaskan dari acara lain dan dengan demikian jika saya tidak mendapatkan item apa pun di e.OldItems ... Saya tidak akan dapat melepaskan diri dari acara itu.
KLARIFIKASI: Saya tahu bahwa dokumentasi tidak secara langsung menyatakan bahwa ia harus berperilaku seperti ini. Tetapi untuk setiap tindakan lainnya, itu memberi tahu saya tentang apa yang telah dilakukannya. Jadi, asumsi saya adalah itu akan memberi tahu saya ... dalam kasus Clear / Reset juga.
Di bawah ini adalah contoh kode jika Anda ingin memperbanyaknya sendiri. Pertama dari xaml:
<Window
x:Class="ObservableCollection.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1"
Height="300"
Width="300"
>
<StackPanel>
<Button x:Name="addButton" Content="Add" Width="100" Height="25" Margin="10" Click="addButton_Click"/>
<Button x:Name="moveButton" Content="Move" Width="100" Height="25" Margin="10" Click="moveButton_Click"/>
<Button x:Name="removeButton" Content="Remove" Width="100" Height="25" Margin="10" Click="removeButton_Click"/>
<Button x:Name="replaceButton" Content="Replace" Width="100" Height="25" Margin="10" Click="replaceButton_Click"/>
<Button x:Name="resetButton" Content="Reset" Width="100" Height="25" Margin="10" Click="resetButton_Click"/>
</StackPanel>
</Window>
Selanjutnya, kode di belakang:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
namespace ObservableCollection
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
_integerObservableCollection.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_integerObservableCollection_CollectionChanged);
}
private void _integerObservableCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
switch (e.Action)
{
case System.Collections.Specialized.NotifyCollectionChangedAction.Add:
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Move:
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Remove:
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Replace:
break;
case System.Collections.Specialized.NotifyCollectionChangedAction.Reset:
break;
default:
break;
}
}
private void addButton_Click(object sender, RoutedEventArgs e)
{
_integerObservableCollection.Add(25);
}
private void moveButton_Click(object sender, RoutedEventArgs e)
{
_integerObservableCollection.Move(0, 19);
}
private void removeButton_Click(object sender, RoutedEventArgs e)
{
_integerObservableCollection.RemoveAt(0);
}
private void replaceButton_Click(object sender, RoutedEventArgs e)
{
_integerObservableCollection[0] = 50;
}
private void resetButton_Click(object sender, RoutedEventArgs e)
{
_integerObservableCollection.Clear();
}
private ObservableCollection<int> _integerObservableCollection = new ObservableCollection<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
}
}