8

ObservableCollection实现INotifyCollectionChangedINotifyPropertyChanged

  • 我知道添加、删除(+清除)和替换项目是通过集合的事件 通知消费者的CollectionChanged,并且如果现有项目的更新可以使用项目的事件 来监控PropertyChanged它们自己实现INotifyPropertyChanged

  • 我从其他人那里了解到,您无法注册该集合的事件 PropertyChanged,因为它是只读的。

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

这里和那里的评论似乎使讨论变得混乱,暗示 的魔法ObservableCollection是实现两个接口,允许通知集合和项目内容更改,虽然这是不正确的(这被许多示例忽略了集合绑定到一个列表框,该列表框在项目内容更改后会神奇地更新,建议集合通知列表框)。

实际上,集合的唯一优势似乎就是执行INotifyCollectionChanged。处理项目属性更改似乎并不ObservableCollection比使用另一个集合更容易:只有当项目实现INotifyPropertyChanged时才有可能,他们可能不会这样做,并且如果用户设法独立于集合来挂钩此事件。

这个对吗?

4

3 回答 3

9

如果您ObservableCollection<T>使用 Reflector 查看源代码,您可以看到针对两个属性引发了此事件:

this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");

请注意,显式ObservableCollection<T>实现INotifyPropertyChanged,因此您PropertyChanged只能通过INotifyPropertyChanged变量访问事件:

INotifyPropertyChanged inpc = myObservableCollection;
inpc.PropertyChanged += myEventHandler;
于 2009-12-20T18:37:31.673 回答
3

WPFs 绑定机制可以使用开箱即用的 INotifyPropertyChanged (INpc)。

顾名思义,INpc 允许 WPF 检测对可能属于或不属于集合的对象属性的更改。

ObservableCollection (OC) 实现 INotifyCollectionChanged (InCC),正如您所说,集合本身会通知 WPF(以及任何其他有能力处理更新的人)对其项目集合的更新(添加删除等)。如果 OC 包含本身不实现 INpc 的对象,则 WPF 无法知道每个项目的属性如何更改。

更新

在回答以下问题时“我们可以依靠收集 INpc 事件而不是在每个新项目上注册以获得通知吗?” 答案是不。如果每个项目没有在其属性上实现 Inpc,那么 WPF 就无法知道每个项目的哪些值发生了变化。

WPF 仍会从 OC 获知项目何时被添加或部分删除。Items 属性使用 INpc 来通知更新,就像任何在其属性上实现 INpc 的类一样。实施 InCC 是为了跟踪集合更改而不是项目中每个项目的值。

于 2009-12-20T18:18:27.903 回答
1

只是一个猜测:所以可以通知集合的 Count 属性的更改?

于 2009-12-20T18:08:41.557 回答