我已将 CollectionChanged eventhandler(onCollectionChanged)
添加到 ObservableCollection
属性之一。
我发现 onCollectionChanged
方法仅在向集合中添加项目或删除项目时被调用,但在编辑集合项目时不会被调用。
我想知道如何在单个集合中发送新添加、删除和编辑的项目的列表/集合。
谢谢。
最佳答案
您必须为每个项目添加一个 PropertyChanged
监听器(必须实现 INotifyPropertyChanged
)以获取有关编辑可观察列表中对象的通知。
public ObservableCollection<Item> Names { get; set; }
public List<Item> ModifiedItems { get; set; }
public ViewModel()
{
this.ModifiedItems = new List<Item>();
this.Names = new ObservableCollection<Item>();
this.Names.CollectionChanged += this.OnCollectionChanged;
}
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach(Item newItem in e.NewItems)
{
ModifiedItems.Add(newItem);
//Add listener for each item on PropertyChanged event
newItem.PropertyChanged += this.OnItemPropertyChanged;
}
}
if (e.OldItems != null)
{
foreach(Item oldItem in e.OldItems)
{
ModifiedItems.Add(oldItem);
oldItem.PropertyChanged -= this.OnItemPropertyChanged;
}
}
}
void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
Item item = sender as Item;
if(item != null)
ModifiedItems.Add(item);
}
也许您必须检查某些项目是否已经在 ModifedItems-List 中(使用 List 的方法 Contains(object obj)),并且只有在该方法的结果为 false时才添加新项目强>.
Item
类必须实现 INotifyPropertyChanged
。看这个example知道怎么做。正如 Robert Rossney 所说,如果您有此要求,您也可以使用 IEditableObject
来实现。
关于c# - 实现 CollectionChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4588359/