针对INotifyCollectionChanged类型的数据绑定

时间:2013-03-06 23:29:22

标签: wpf mvvm inotifycollectionchanged

我希望有一个域模型集合类和一个视图模型类,它只反映和投影域模型的元素 - 但它本身是只读的。

我的想法是两种类型都实现了INotifyCollectionChanged接口,然后视图模型类型只是作为代理和投影仪,它在元素视图模型类型中包装模型元素。

问题是:实现INotifyCollectionChanged足以启用WPF数据绑定到例如DataGrid或ListView或启用基于集合的数据绑定所需的最小接口集是什么?

1 个答案:

答案 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