我有一个可观察的集合...... SelectableDataContext<T>
..在泛型类SelectableDataContext<T>
中......有两个私有成员变量
当IsSelected属性发生更改时...我的集合的已更改属性未触发。
我认为它应该触发......因为它是Reset
中的INotifyCollectionChangedAction
。
答案 0 :(得分:33)
这是一个古老的问题,但是对于任何可能通过搜索遇到此问题的人来说都是如此:
NotifyCollectionChangedAction.Reset
表示“收藏内容发生了巨大变化”。引发Reset事件的一种情况是在底层的observable集合上调用Clear()
。
使用重置事件,您无法获得NewItems
参数中的OldItems
和NotifyCollectionChangedEventArgs
个集合。
这意味着您最好使用事件的“发送者”来获取对已修改集合的引用并直接使用它,即假设它是一个新列表。
这方面的一个例子可能是:
((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)
INotifyCollectionChanged
和INotifyPropertyChanged
之间存在差异。
当对象中的某个值发生变化时,它应该使用INotifyPropertyChanged
接口实现通知其他人。
另一方面,当number of items
或items themselves
更改集合时,应该让其他人知道使用INotifyCollectionChanged
实现。
现在,在您的情况下,集合中对象的属性值会发生变化。这应该会引发PropertyChanged
事件,而不是CollectionChanged
事件。
答案 2 :(得分:-1)
当且仅当您通过添加新项目或从集合中删除现有项目来修改集合时,才会触发更改集合。