当使用ObservableCollection<T>时,我是否仍然需要在类型T上实现INotifyPropertyChanged?

9

ObservableCollection<T>的MSDN参考页面指出:

“您集合中的对象必须满足绑定源概述中描述的要求。特别地,如果您使用OneWayTwoWay(例如,您希望UI在源属性动态更改时更新),则必须实现适当的属性更改通知机制,例如INotifyPropertyChanged接口。”

既然ObservableCollection<T>已经实现了INotifyPropertyChanged,为什么我还需要在T上再次实现INotifyPropertyChanged呢?

2个回答

10
考虑把你的观察集合作为表格的数据源。集合中的每个对象占据一行,并在表格中跨多列显示。
视图(即你的表格)需要知道何时根据对象的属性变化修改每个单元格,还需响应添加和从集合中删除对象而修改单元格。
你的可观察集合负责处理表格行:当插入、移除等操作发生时,它会通知观察者。但是,它不知道个别对象的情况,因此无法处理表格列。
这就是对象的作用:通过实现 "INotifyPropertyChanged" 接口,让你的表格管理列中的数据。

这与通知集合内容更改有关(可以添加、更新和删除项目)。那么如何通知集合容器的更改呢?视图绑定的属性,类型为ObservableCollection,也必须被分配并且可以更改。我假设在此属性的setter中必须实现INPC(除非它是依赖属性),但许多代码片段并没有显示此实现。正确吗?这个答案说是这样的,但在我看到它之前没有得到任何投票。 - mins

3
INotifyPropertyChanged需要由正在更改其属性的对象引发。ObservableCollection不能仅检测其包含的对象的更改并代表您传递这些更改。
集合实现INotifyPropertyChanged的原因并不特别有用。我怀疑它只会为集合的Count属性引发更改事件,因为随着向集合添加/删除项,该属性将发生更改。
如果您只对添加/删除项目感兴趣,则可能不需要在类中实现此接口。但是,如果您的UI绑定到对象的属性,则需要实现它,以便UI做出反应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接