Tôi có một cái gì đó ở đây khiến tôi thực sự mất cảnh giác.
Tôi có một ObservableCollection của T chứa đầy các mục. Tôi cũng có một trình xử lý sự kiện được đính kèm với sự kiện CollectionChanged.
Khi bạn Xóa bộ sưu tập, nó gây ra sự kiện CollectionChanged với e.Action được đặt thành NotifyCollectionChangedAction.Reset. Ok, đó là bình thường. Nhưng điều kỳ lạ là cả e.OldItems hay e.NewItems đều không có bất cứ thứ gì trong đó. Tôi mong đợi e.OldItems chứa đầy tất cả các mục đã bị xóa khỏi bộ sưu tập.
Đã có người khác nhìn thấy điều này? Và nếu vậy, họ đã làm thế nào để vượt qua nó?
Một số thông tin cơ bản: Tôi đang sử dụng sự kiện CollectionChanged để đính kèm và tách khỏi sự kiện khác và do đó nếu tôi không nhận được bất kỳ mục nào trong e.OldItems ... tôi sẽ không thể tách khỏi sự kiện đó.
XÁC NHẬN: Tôi biết rằng tài liệu không nói rõ rằng nó phải hoạt động theo cách này. Nhưng đối với mọi hành động khác, nó sẽ thông báo cho tôi về những gì nó đã làm. Vì vậy, giả định của tôi là nó sẽ cho tôi biết ... trong trường hợp Xóa / Đặt lại.
Dưới đây là mã mẫu nếu bạn muốn tự sao chép lại. Trước hết 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>
Tiếp theo, mã đằng sau:
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 };
}
}