【问题标题】:When using ObservableCollection<T>, do I still need to implement INotifyPropertyChanged on type T?使用 ObservableCollection<T> 时,是否还需要在类型 T 上实现 INotifyPropertyChanged?
【发布时间】:2012-05-04 16:50:37
【问题描述】:

The MSDN reference page for ObservableCollection&lt;T&gt; 备注:

"您的集合中的对象必须满足Binding Sources Overview 中描述的要求。特别是,如果您使用OneWayTwoWay(例如,您希望在源属性动态更改时更新您的 UI ),您必须实现一个合适的属性更改通知机制,例如INotifyPropertyChanged 接口。”

既然ObservableCollection&lt;T&gt; 已经实现了INotifyPropertyChanged,为什么我还需要在T 上再次实现INotifyPropertyChanged

【问题讨论】:

    标签: .net observablecollection inotifypropertychanged


    【解决方案1】:

    将您的可观察集合视为表的数据源。集合中的每个对象占据一行,并跨多列显示在表格中。

    视图(即您的表格)需要知道何时修改每个单元格以响应对象属性的变化,以及响应向集合中添加和删除对象。

    您的可观察集合负责处理表行:当对象被插入、移除、移动等时,它会通知其观察者。但是,它缺乏对单个对象的了解,因此对处理表列没有帮助。

    这就是你的对象的用武之地:通过实现INotifyPropertyChanged,它们让你的表管理列中的数据。

    【讨论】:

    • 这与通知集合内容的变化有关(可以添加、更新和删除项目)。收集容器变化的通知呢?视图绑定的属性,类型为 ObservableCollection 也必须分配并且可以更改。我假设 INPC 必须在此属性的设置器中实现(除非它是依赖属性),但许多代码摘录并未显示此实现。正确的? This answer 说是,但在我看到之前有 0 票。
    【解决方案2】:

    INotifyPropertyChanged 需要由其属性正在更改的对象引发。 ObservableCollection 不能简单地检测它包含的对象的变化并代表您传递这些变化。

    集合实现INotifyPropertyChanged 的原因并不是特别有用。我怀疑它只会为集合的Count 属性引发一个更改事件,该事件会随着项目被添加/删除到集合中而改变。

    如果您只对添加/删除的项目感兴趣,您可能不需要在您的类中实现此接口。但是,如果您的 UI 绑定到对象的属性,如果您希望 UI 做出反应,则需要实现它。

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 1970-01-01
      • 2013-06-03
      • 2011-10-22
      • 1970-01-01
      • 2012-04-05
      • 2023-03-21
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多