Ich habe hier etwas, das mich wirklich überrascht.
Ich habe eine ObservableCollection von T, die mit Elementen gefüllt ist. Ich habe auch einen Ereignishandler an das CollectionChanged-Ereignis angehängt.
Wenn Sie löschen die Sammlung es verursacht ein Collection Ereignis mit e.Action Set NotifyCollectionChangedAction.Reset. Ok, das ist normal. Aber was seltsam ist, ist, dass weder e.OldItems noch e.NewItems etwas enthalten. Ich würde erwarten, dass e.OldItems mit allen Elementen gefüllt wird, die aus der Sammlung entfernt wurden.
Hat das noch jemand gesehen? Und wenn ja, wie sind sie damit umgegangen?
Einige Hintergrundinformationen: Ich verwende das CollectionChanged-Ereignis, um ein anderes Ereignis anzuhängen und von diesem zu trennen. Wenn ich also keine Elemente in e.OldItems erhalte, kann ich mich nicht von diesem Ereignis trennen.
ERKLÄRUNG: Ich weiß, dass die Dokumentation nicht direkt besagt , dass sie sich so verhalten muss. Aber für jede andere Aktion benachrichtigt es mich darüber, was es getan hat. Ich gehe also davon aus, dass es mir sagen würde ... auch im Fall von Löschen / Zurücksetzen.
Unten finden Sie den Beispielcode, wenn Sie ihn selbst reproduzieren möchten. Zunächst einmal die 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>
Als nächstes der Code dahinter:
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 };
}
}