5

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

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

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

4

1 回答 1

1

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

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

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

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

于 2014-07-26T17:57:43.747 回答