在ObservableCollection上实现INotifyPropertyChanged的目的是什么?

时间:2009-12-20 18:00:31

标签: wpf observablecollection inotifypropertychanged

ObservableCollection同时实现了INotifyCollectionChangedINotifyPropertyChanged

  • 我明白了这些补充, 删除(+清除)和替换 物品是消费者可以通知的 通过集合的活动 CollectionChanged,并且更新 在现有的项目中都可以 使用'事件进行监控 PropertyChanged如果他们实施的话 他们自己INotifyPropertyChanged

  • 我从别人那里读到你不能 注册集合的活动 PropertyChanged因为它是 只读的。

那么它的目的是什么,我们可以利用它做什么?

这里和那里的评论似乎让讨论感到困惑,暗示ObservableCollection的魔力是实现两个接口,允许同时收到有关收集和项目内容更改的通知,而这是不正确的(这许多示例忽略了这样的情况,其中集合被绑定到列表框,该列表框在项目内容更改后神奇地更新,建议集合通知列表框。)

实际上,该集合的唯一优势似乎是实现INotifyCollectionChanged。处理项目属性更改似乎与ObservableCollection比使用其他集合更容易:只有当项目实现INotifyPropertyChanged时,它们可能不会执行,并且如果用户设法挂钩活动独立于收藏。

这是正确的吗?

3 个答案:

答案 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属性的更改?