【问题标题】:What is the point of INotifyCollectionChanged in terms of databinding (C# WinRt)INotifyCollectionChanged 在数据绑定方面有什么意义(C# WinRt)
【发布时间】:2014-07-21 12:36:04
【问题描述】:

背景: 我试图通过实现 IEnumerable、INotifyPropertyChanged 和 INotifyCollectionChanged 来推出我自己的 observable 集合。它工作正常,但是当我进行数据绑定时,CollectionChanged 事件始终为空。然而,数据绑定属性确实更新了,因为我正在发送 Items[] 属性更改事件。 所以这让我想知道 INotifyCollectionChanged 在数据绑定方面的意义是什么,因为在我的类中它永远不会被触发,但数据绑定仍然有效(它更新了对集合的所有绑定)。

然后我决定做更多的挖掘,并反编译 ObservableCollection。当我将数据绑定到 ObservableCollection 时,CollectionChanged 事件不像我的实现那样为空。

所以我真的想知道为什么 ObservableCollection 得到“特殊”处理,以及 INotifyCollectionChange 在数据绑定中扮演什么角色(如果有的话)

【问题讨论】:

    标签: c# windows-8 observablecollection inotifycollectionchanged


    【解决方案1】:

    INotifyCollectionChanged 可以由集合实现,以便当从集合中添加或删除元素时,可以将这些事件通知给相关方。这很有用,例如,当您需要 ListViewGridView 或其他显示集合内容的显示控件时,当集合的内容发生更改时(通过添加或删除元素)更新其显示。更一般地说,任何对象都可以数据绑定到事件,以便在从集合中添加/删除项目时得到通知,以执行数据绑定组件需要执行的任何操作——它不仅必须是 GUI 控件。但是,对集合的任何其他操作都不会导致向数据绑定控件/对象发出通知。为了实现这一点,您还需要在集合上实现INotifyPropertyChanged,创建您还希望发布的其他PropertyChanged 事件以通知数据绑定对象,并在相关操作发生时引发事件。

    此外,如果您希望集合中的每个项目在项目本身发生变化时更新其在 UI 中的呈现,那么表示项目的类型应该实现 INotifyPropertyChanged

    在我看来,您需要实现自己的CollectionChanged 事件。内置的System.Array 和/或System.Collections.ArrayList 类没有与之关联的任何事件。因此,如果您使用这些类之一作为您的后备存储,那么在每次添加/删除项目时,您需要确保为您的自定义集合实现引发 CollectionChanged 事件。

    但是,我需要问一下,既然 Microsoft 已经提供了 ObservableCollection<T> 对象(您可以将其子类化并免费获得您正在寻找的功能),为什么还要推出您自己的 observable 集合?

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 2010-11-15
      • 2011-07-10
      • 2010-10-29
      相关资源
      最近更新 更多