c#中observablecollection的CollectionChanged事件
本文关键字:CollectionChanged 事件 observablecollection | 更新日期: 2023-09-27 18:07:48
如何把这段代码写得更好:
void CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (sender is ObservableCollection<PromotionPurchaseAmount>)
{
if (e.Action == NotifyCollectionChangedAction.Remove)
{
foreach (PromotionPurchaseAmount item in e.NewItems)
{
//Removed items
item.PropertyChanged -= EntityViewModelPropertyChanged;
}
}
else if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (PromotionPurchaseAmount item in e.NewItems)
{
//Added items
item.PropertyChanged += EntityViewModelPropertyChanged;
}
}
}
else if (sender is ObservableCollection<PromotionItemPricing>)
{
if (e.Action == NotifyCollectionChangedAction.Remove)
{
foreach (PromotionItemPricing item in e.NewItems)
{
//Removed items
item.PropertyChanged -= EntityViewModelPropertyChanged;
}
}
else if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (PromotionItemPricing item in e.NewItems)
{
//Added items
item.PropertyChanged += EntityViewModelPropertyChanged;
}
}
}
else if (sender is ObservableCollection<PromotionItem>)
{
if (e.Action == NotifyCollectionChangedAction.Remove)
{
foreach (PromotionItem item in e.NewItems)
{
//Removed items
item.PropertyChanged -= EntityViewModelPropertyChanged;
}
}
else if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (PromotionItem item in e.NewItems)
{
//Added items
item.PropertyChanged += EntityViewModelPropertyChanged;
}
}
}
}
- 当
e.Action == NotifyCollectionChangedAction.Remove
需要迭代e.OldItems
而不是e.NewItems
时。 - 当
e.Action == NotifyCollectionChangedAction.Replace
时,您需要迭代e.OldItems
以从旧项目中删除事件处理程序,并且您需要迭代e.NewItems
以向新项目添加事件处理程序。 -
这样重构代码:
if (sender is ObservableCollection<PromotionPurchaseAmount> || sender is ObservableCollection<PromotionItemPricing> || sender is ObservableCollection<PromotionItem>) { if (e.Action == NotifyCollectionChangedAction.Remove || e.Action == NotifyCollectionChangedAction.Replace) { foreach (INotifyPropertyChanged item in e.OldItems) { //Removed items item.PropertyChanged -= EntityViewModelPropertyChanged; } } if (e.Action == NotifyCollectionChangedAction.Add || e.Action == NotifyCollectionChangedAction.Replace) { foreach (INotifyPropertyChanged item in e.NewItems) { //Added items item.PropertyChanged += EntityViewModelPropertyChanged; } } }
这个可以工作,因为你所有的Promotion类都实现了INotifyPropertyChanged