Burada beni gerçekten hazırlıksız yakalayan bir şey var.
Öğelerle dolu bir ObservableCollection T var. Ayrıca CollectionChanged olayına eklenmiş bir olay işleyicim var.
Ne zaman temizleyin koleksiyonunu o NotifyCollectionChangedAction.Reset için e.Action seti ile bir CollectionChanged olayına neden olur. Tamam, bu normal. Ancak tuhaf olan, eski Öğeler veya e.Yeni Öğeler'de hiçbir şey olmamasıdır. E.OldItems'in koleksiyondan çıkarılan tüm öğelerle doldurulmasını beklerdim.
Bunu başka gören oldu mu? Ve eğer öyleyse, bunu nasıl aştılar?
Bazı arka plan: CollectionChanged olayını başka bir olaya eklemek ve ondan ayırmak için kullanıyorum ve bu nedenle e.OldItems'te herhangi bir öğe alamazsam ... O olaydan ayrılamayacağım.
AÇIKLAMA: Dokümantasyonun bu şekilde davranması gerektiğini açıkça belirtmediğini biliyorum. Ama diğer her eylem için, bana ne yaptığını bildiriyor. Öyleyse, benim varsayımım, Sil / Sıfırla durumunda da bana söyleyeceğidir.
Kendiniz yeniden üretmek isterseniz, örnek kod aşağıdadır. İlk önce 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>
Ardından, arkasındaki kod:
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 };
}
}