ฉันมีบางอย่างที่นี่ที่ทำให้ฉันไม่ทันระวัง
ฉันมี ObservableCollection ของ T ที่เต็มไปด้วยไอเท็ม ฉันยังมีตัวจัดการเหตุการณ์ที่แนบมากับเหตุการณ์ CollectionChanged
เมื่อคุณล้างคอลเลกชันจะทำให้เกิดเหตุการณ์ CollectionChanged ด้วย e.Action ที่ตั้งค่าเป็น NotifyCollectionChangedAction.Reset โอเคเป็นเรื่องปกติ แต่สิ่งที่แปลกคือไม่มี e.OldItems หรือ e.NewItems มีอะไรอยู่ในนั้น ฉันคาดหวังว่า e.OldItems จะเต็มไปด้วยรายการทั้งหมดที่ถูกลบออกจากคอลเลกชัน
มีใครเห็นสิ่งนี้อีกบ้าง? แล้วถ้าเป็นเช่นนั้นพวกเขาไปถึงมันได้อย่างไร?
ความเป็นมาบางประการ: ฉันใช้เหตุการณ์ CollectionChanged เพื่อแนบและแยกออกจากเหตุการณ์อื่นดังนั้นหากฉันไม่ได้รับไอเท็มใด ๆ ใน e.OldItems ... ฉันจะไม่สามารถแยกออกจากเหตุการณ์นั้น
ชี้แจง: ฉันจะรู้ว่าเอกสารไม่ตรงไปตรงมาว่ารัฐจะมีการทำงานในลักษณะนี้ แต่สำหรับการกระทำอื่น ๆ มันเป็นการแจ้งให้ฉันทราบถึงสิ่งที่ทำลงไป ดังนั้นสมมติฐานของฉันก็คือมันจะบอกฉัน ... ในกรณีของ Clear / Reset เช่นกัน
ด้านล่างนี้คือตัวอย่างโค้ดหากคุณต้องการทำซ้ำด้วยตัวเอง ก่อนอื่นจาก 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>
ถัดไปรหัสหลัง:
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 };
}
}