【问题标题】:What is the purpose of having implemented INotifyPropertyChanged on ObservableCollection?在 ObservableCollection 上实现 INotifyPropertyChanged 的​​目的是什么?
【发布时间】:2010-12-28 12:47:36
【问题描述】:

ObservableCollection 实现了INotifyCollectionChangedINotifyPropertyChanged

  • 我了解补充, 删除(+清除)和替换 的物品需要通知消费者 通过收藏的事件 CollectionChanged,然后更新 在现有项目中可以 使用 items' 事件进行监控 PropertyChanged 如果他们实施 自己INotifyPropertyChanged

  • 我从别人那里读到你不能 注册收藏活动 PropertyChanged 因为它是 只读。

那么它的目的是什么,我们可以利用它做什么

这里和那里的 cmets 似乎通过暗示 ObservableCollection 的神奇之处在于实现这两个接口,从而使讨论变得混乱,允许在集合和项目内容更改时收到通知,虽然这是不正确的(这被忽略了通过许多示例,其中集合绑定到列表框,列表框会在项目内容更改后神奇地更新,这表明集合会通知列表框。

其实集合的唯一优势似乎就是实现了INotifyCollectionChanged。使用ObservableCollection 处理项目属性更改似乎并不比使用另一个集合更容易:只有当项目实现INotifyPropertyChanged 时才有可能,他们可能不会这样做,并且如果用户设法独立于收藏。

这是正确的吗?

【问题讨论】:

    标签: wpf observablecollection inotifypropertychanged


    【解决方案1】:

    WPFs 绑定机制可以使用开箱即用的 INotifyPropertyChanged (INpc)。

    顾名思义,INpc 允许 WPF 检测对可能属于或不属于集合的对象属性的更改。

    ObservableCollection (OC) 实现了 INotifyCollectionChanged (InCC),正如您所说,集合本身会通知 WPF(以及任何其他有能力处理更新的人)对其项目集合的更新(添加删除等)。如果 OC 包含本身不实现 INpc 的对象,则 WPF 无法知道每个项目的属性如何更改。

    更新

    在回答以下问题时“我们是否可以依靠收集 INpc 事件而不是在每个新项目上注册以获得通知?”答案是不。如果每个项目没有在其属性上实现 Inpc,那么 WPF 就无法知道每个项目的哪些值发生了变化。

    当项目被部分添加或删除时,WPF 仍会从 OC 获知。 Items 属性使用 INpc 来通知更新,就像任何在其属性上实现 INpc 的类一样。实施 InCC 是为了跟踪集合更改而不是项目中每个项目的值。

    【讨论】:

      【解决方案2】:

      如果您使用 Reflector 查看 ObservableCollection<T> 源代码,您可以看到针对两个属性引发了此事件:

      this.OnPropertyChanged("Count");
      this.OnPropertyChanged("Item[]");
      

      请注意,ObservableCollection<T> 显式实现了INotifyPropertyChanged,因此您只能通过INotifyPropertyChanged 变量访问PropertyChanged 事件:

      INotifyPropertyChanged inpc = myObservableCollection;
      inpc.PropertyChanged += myEventHandler;
      

      【讨论】:

      • 虽然事实上准确而简洁,但我不确定这如何回答“所以目的是什么?” Q的一部分
      • 目的是通知订阅者集合发生了变化。在这方面,它与 CollectionChanged 事件的目的相同,但 INotifyPropertyChanged 比 INotifyCollectionChanged 得到更广泛的支持
      【解决方案3】:

      只是一个猜测:所以可以通知集合的 Count 属性的更改?

      【讨论】:

        猜你喜欢
        • 2015-09-29
        • 2012-04-05
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        相关资源
        最近更新 更多