【问题标题】:Databinding against an INotifyCollectionChanged type针对 INotifyCollectionChanged 类型的数据绑定
【发布时间】:2013-02-22 00:07:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf mvvm inotifycollectionchanged


    【解决方案1】:

    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

    【讨论】:

    • 有趣。无论如何,元素视图模型(到目前为止)是不可变的。我看不到视图中显示的视图模型 - 但后来我实现了 IEnumerable 并且成功了。实现最小接口集的主要目的只是为了确保只读模式。元素的数量将非常少(
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多