C# CollectionChanged事件的observablecollection在c中#
如何更好地编写此代码:C# CollectionChanged事件的observablecollection在c中#,c#,events,C#,Events,如何更好地编写此代码: void CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { if (sender is ObservableCollection<PromotionPurchaseAmount>) { if (e.Action == NotifyCollectionChangedAction.
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;
}
}
}
}
void CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
如果(发送方是可观察的收集)
{
if(e.Action==NotifyCollectionChangedAction.Remove)
{
foreach(e.NewItems中的促销采购金额项目)
{
//删除的项目
item.PropertyChanged-=EntityViewModelPropertyChanged;
}
}
else if(e.Action==NotifyCollectionChangedAction.Add)
{
foreach(e.NewItems中的促销采购金额项目)
{
//新增项目
item.PropertyChanged+=EntityViewModelPropertyChanged;
}
}
}
else if(发送方为可观察收集)
{
if(e.Action==NotifyCollectionChangedAction.Remove)
{
foreach(e.NewItems中的促销临时定价项目)
{
//删除的项目
item.PropertyChanged-=EntityViewModelPropertyChanged;
}
}
else if(e.Action==NotifyCollectionChangedAction.Add)
{
foreach(e.NewItems中的促销临时定价项目)
{
//新增项目
item.PropertyChanged+=EntityViewModelPropertyChanged;
}
}
}
else if(发送方为可观察收集)
{
if(e.Action==NotifyCollectionChangedAction.Remove)
{
foreach(e.NewItems中的促销项)
{
//删除的项目
item.PropertyChanged-=EntityViewModelPropertyChanged;
}
}
else if(e.Action==NotifyCollectionChangedAction.Add)
{
foreach(e.NewItems中的促销项)
{
//新增项目
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;
}
}
}
if(发送方是可观察的集合||)
发送方是可观察的集合| |
发送方是可观察的(收集)
{
如果(e.Action==NotifyCollectionChangedAction.Remove||
e、 Action==NotifyCollectionChangedAction.Replace)
{
foreach(e.OldItems中的INotifyPropertyChanged项)
{
//删除的项目
item.PropertyChanged-=EntityViewModelPropertyChanged;
}
}
如果(e.Action==NotifyCollectionChangedAction.Add||
e、 Action==NotifyCollectionChangedAction.Replace)
{
foreach(e.NewItems中的INotifyPropertyChanged项)
{
//新增项目
item.PropertyChanged+=EntityViewModelPropertyChanged;
}
}
}
这是可行的,因为您的所有促销类都实现了
INotifyPropertyChanged
如果项目被替换了怎么办?那么事件处理程序不也应该被删除吗?这是怎么回事?你需要去掉“else”肉汤。从我写评论后读到的内容来看,replace是指使用索引器的setter。所以第三种选择可能更好@乔丹:关于其他方面的问题,你是对的。修正了。但是,您不需要第三个选项(e.NewItems中的ODataQueryCauseviewModel项){item.PropertyChanged+=XXXChanged;}}你具体在寻找什么?代码是否工作不正常?也许这更适合。帮助了我,不知道为什么它关闭了。也帮助了我,我不认为它太本地化了。