我希望有一个域模型集合类和一个视图模型类,它只反映和投影域模型的元素 - 但它本身是只读的。
我的想法是两种类型都实现了INotifyCollectionChanged接口,然后视图模型类型只是作为代理和投影仪,它在元素视图模型类型中包装模型元素。
问题是:实现INotifyCollectionChanged足以启用WPF数据绑定到例如DataGrid或ListView或启用基于集合的数据绑定所需的最小接口集是什么?
答案 0 :(得分:4)
INotifyCollectionChanged
将不会更新您的UI,只有在您的集合中添加或删除整个元素时才会更新。
因此,如果您愿意跟踪整个元素更改,那么INotifyCollectionChanged
就足够了,任何进一步的粒度,您需要在属性设置器中实现INotifyPropertyChanged
。
另一点值得注意的是,如果您使用ObservableCollection
来容纳您的列表,那么这已经为您实现了INotifiyCollectionChanged
。
修改强>
以下是微软的观点;
您可以枚举实现
IEnumerable
的任何集合 接口。但是,要设置动态绑定以便插入或插入 集合中的删除会自动更新UI 集合必须实现INotifyCollectionChanged
接口。这个 接口公开一个应该在每次引发时引发的事件 潜在的集合变化。WPF提供
ObservableCollection(Of T)
类,它是内置的 实现暴露的数据集合INotifyCollectionChanged
界面。注意完全支持 将数据值从源对象传输到目标,每个对象 在您的集合中,还必须支持可绑定属性 实现
INotifyPropertyChanged
接口。在实施自己的收藏之前, 考虑使用
ObservableCollection(Of T)
或其中一个 集合类,例如List(Of T)
,Collection(Of T)
和BindingList(Of T)
等等。如果您有高级方案 并且想要实现自己的集合,请考虑使用IList
提供可以单独使用的非泛型对象集合 通过索引访问,从而获得最佳性能。
从..
http://msdn.microsoft.com/en-us/library/ms752347.aspx#binding_to_collections