一尘不染

实现CollectionChanged

c#

我已添加CollectionChanged eventhandler(onCollectionChanged)到其中一个ObservableCollection属性。

我发现该onCollectionChanged方法仅在添加项目或将项目移除到集合中时才被调用,而在集合项被编辑时不被调用。

我想知道如何在单个集合中发送新添加,删除和编辑的项目的列表/集合。

谢谢。


阅读 491

收藏
2020-05-19

共1个答案

一尘不染

您必须为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。查看此示例以了解操作方法。正如罗伯特·罗斯尼(Robert
Rossney)所说,IEditableObject如果您有此要求,您也可以使用。

2020-05-19