什么是notifycollectionchangedaction重置值

时间:2010-12-21 02:54:50

标签: wpf mvvm reset inotifycollectionchanged

我有一个可观察的集合...... SelectableDataContext<T> ..在泛型类SelectableDataContext<T>中......有两个私有成员变量

  1. 私人T项目。
  2. 选择私人布尔。
  3. 当IsSelected属性发生更改时...我的集合的已更改属性未触发。

    我认为它应该触发......因为它是Reset中的INotifyCollectionChangedAction

3 个答案:

答案 0 :(得分:33)

这是一个古老的问题,但是对于任何可能通过搜索遇到此问题的人来说都是如此:

NotifyCollectionChangedAction.Reset表示“收藏内容发生了巨大变化”。引发Reset事件的一种情况是在底层的observable集合上调用Clear()

使用重置事件,您无法获得NewItems参数中的OldItemsNotifyCollectionChangedEventArgs个集合。

这意味着您最好使用事件的“发送者”来获取对已修改集合的引用并直接使用它,即假设它是一个新列表。

这方面的一个例子可能是:

((INotifyCollectionChanged)stringCollection).CollectionChanged += new NotifyCollectionChangedEventHandler(StringCollection_CollectionChanged);
  ...

void StringCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    switch (e.Action)
    {
        case NotifyCollectionChangedAction.Add:
            foreach (string s in e.NewItems)
            {
                InternalAdd(s);
            }
            break;

        case NotifyCollectionChangedAction.Remove:
            foreach (string s in e.OldItems)
            {
                InternalRemove(s);
            }
            break;

        case NotifyCollectionChangedAction.Reset:
            ReadOnlyObservableCollection<string> col = sender as ReadOnlyObservableCollection<string>;
            InternalClearAll();
            if (col != null)
            {
                foreach (string s in col)
                {
                    InternalAdd(s);
                }
            }
            break;
    }
}

此处有关此重置事件的大量讨论:When Clearing an ObservableCollection, There are No Items in e.OldItems

答案 1 :(得分:2)

INotifyCollectionChangedINotifyPropertyChanged之间存在差异。

当对象中的某个值发生变化时,它应该使用INotifyPropertyChanged接口实现通知其他人。

另一方面,当number of itemsitems themselves更改集合时,应该让其他人知道使用INotifyCollectionChanged实现。

现在,在您的情况下,集合中对象的属性值会发生变化。这应该会引发PropertyChanged事件,而不是CollectionChanged事件。

答案 2 :(得分:-1)

当且仅当您通过添加新项目或从集合中删除现有项目来修改集合时,才会触发更改集合。