Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CollectionChanged事件的observablecollection在c中#_C#_Events - Fatal编程技术网

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;}}你具体在寻找什么?代码是否工作不正常?也许这更适合。帮助了我,不知道为什么它关闭了。也帮助了我,我不认为它太本地化了。