ObservableCollection
同时实现了INotifyCollectionChanged
和INotifyPropertyChanged
。
我明白了这些补充,
删除(+清除)和替换
物品是消费者可以通知的
通过集合的活动
CollectionChanged
,并且更新
在现有的项目中都可以
使用项'事件进行监控
PropertyChanged
如果他们实施的话
他们自己INotifyPropertyChanged
。
我从别人那里读到你不能
注册集合的活动
PropertyChanged
因为它是
只读的。
那么它的目的是什么,我们可以利用它做什么??
这里和那里的评论似乎让讨论感到困惑,暗示ObservableCollection
的魔力是实现两个接口,允许同时收到有关收集和项目内容更改的通知,而这是不正确的(这许多示例忽略了这样的情况,其中集合被绑定到列表框,该列表框在项目内容更改后神奇地更新,建议集合通知列表框。)
实际上,该集合的唯一优势似乎是实现INotifyCollectionChanged
。处理项目属性更改似乎与ObservableCollection
比使用其他集合更容易:只有当项目实现INotifyPropertyChanged
时,它们可能不会执行,并且如果用户设法挂钩活动独立于收藏。
这是正确的吗?
答案 0 :(得分:9)
如果您使用Reflector查看ObservableCollection<T>
源代码,您会看到此事件是针对两个属性引发的:
this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");
请注意ObservableCollection<T>
明确实施INotifyPropertyChanged
,因此您只能通过PropertyChanged
变量访问INotifyPropertyChanged
事件:
INotifyPropertyChanged inpc = myObservableCollection;
inpc.PropertyChanged += myEventHandler;
答案 1 :(得分:3)
WPF绑定机制可以使用开箱即用的INotifyPropertyChanged(INpc)。
INpc顾名思义允许WPF检测对象属性的更改,这些对象属性可能是也可能不是集合的一部分。
ObservableCollection(OC)实现了INotifyCollectionChanged(InCC),正如您所说,集合本身会通知WPF(以及其他任何有能力处理更新的人)更新其项目集合(添加删除等)。如果OC包含本身不实现INpc的对象,则WPF无法知道每个项属性的更改方式。
<强>更新强>
在回答以下问题时“我们可以依赖收集INpc事件而不是在每个新项目上注册以获得通知吗?”答案是不。如果每个项目都没有在其属性上实现Inpc,那么WPF无法知道每个项目的更改值。
当部分添加或删除项目时,WPF仍然会从OC知道。 Items属性使用INpc来通知更新,就像在其属性上实现INpc的任何类一样。实现InCC是为了跟踪集合更改而不是项目中每个项目的值。
答案 2 :(得分:1)
只是一个猜测:所以可以通知集合的Count属性的更改?