如何在ObservableCollection上引发CollectionChanged事件,并将更改的项目传递给它?

Rac*_*hel 26 c# wpf observablecollection inotifycollectionchanged

我有一个继承自的类,ObservableCollection并添加了一些其他方法,如AddRangeRemoveRange

我的基本方法调用是这样的:

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) Items.Add(i);

    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我想要访问e.NewItems或者e.OldItemsCollectionChanged事件中对集合中的任何项目执行操作,并且NotifyCollectionChangedAction.Reset操作不会传递这些值

void Instances_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null) // e.NewItems is always null
    {
        foreach (var item in e.NewItems)
        {
            if (item is EventInstanceModel)
                ((EventInstanceModel)item).ParentEvent = this;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我认为我可以使用NotifyCollectionChangedAction.Add而不是Reset,但是会引发Range actions are not supported异常

public void AddRange(IEnumerable<T> collection)
{
    var addedItems = collection.ToList();
    foreach (var i in addedItems) Items.Add(i);

    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedItems));
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,我如何提出一个CollectionChanged事件,并将新的或旧的项目列表传递给它?

Rac*_*hel 17

我一直在调查它,显然这个CollectionChanged方法不能用多个项目引发.

所以我可以打电话

OnCollectionChanged(new NotifyCollectionChangedEventArgs(
    NotifyCollectionChangedAction.Add, singleItem));
Run Code Online (Sandbox Code Playgroud)

但我不能打电话

OnCollectionChanged(new NotifyCollectionChangedEventArgs(
    NotifyCollectionChangedAction.Add, listOfItems));
Run Code Online (Sandbox Code Playgroud)

现在我所做的只是为添加的每个项目添加Add事件,但我仍然对此感到不满,因为这意味着我CollectionChangedAddRange方法中的每个项目而不是仅提升一次事件.

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) 
    {
        Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(
            NotifyCollectionChangedAction.Add, i));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是关于如何使用已添加的每个项目的参数引发“CollectionChanged”事件。答案是我们必须为每个项目单独引发事件,因为它不支持通过项目集合引发。 (2认同)

Sup*_*Oli 5

这对我来说很好"独立".意思是我没有使用ObservableCollection数据绑定.所以这不是一个ObservableCollection问题,而是一个ListCollectionView限制.

请阅读以下文章,这是一个非常有趣的读物:

Nathan Nesbit的博客

  • 我确实看到了该链接,但是他还在“尚未完全完成”部分的底部指出,由于“ListCollectionView”的限制,如果添加多个项目,他的“AddRange”版本将不起作用。你是对的,这是“ListCollectionView”的限制,而不是“ObservableCollection”的限制 (2认同)