我想要一个域模型集合类和一个视图模型类,它们只反映和投影域模型的元素——但它本身是只读的。
我的想法是这两种类型都实现了 INotifyCollectionChanged 接口,然后视图模型类型只是充当代理和投影仪,将模型元素包装在元素视图模型类型中。
问题是:实现 INotifyCollectionChanged 是否足以启用 WPF 数据绑定到例如 DataGrid 或 ListView 或者启用基于集合的数据绑定所需的最小接口集是什么?
我想要一个域模型集合类和一个视图模型类,它们只反映和投影域模型的元素——但它本身是只读的。
我的想法是这两种类型都实现了 INotifyCollectionChanged 接口,然后视图模型类型只是充当代理和投影仪,将模型元素包装在元素视图模型类型中。
问题是:实现 INotifyCollectionChanged 是否足以启用 WPF 数据绑定到例如 DataGrid 或 ListView 或者启用基于集合的数据绑定所需的最小接口集是什么?
INotifyCollectionChanged
如果集合中元素内的属性发生更改,则不会更新您的 UI,仅当从您的集合中添加或删除整个元素时。
因此,如果您乐于跟踪整个元素的更改,那么INotifyCollectionChanged
任何进一步的粒度就足够了,您需要INotifyPropertyChanged
在属性设置器中实现。
值得注意的另一点是,如果您使用 anObservableCollection
来存放您的列表,这已经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