在数据绑定方面,INotifyCollectionChanged有什么意义(C#WinRt)

时间:2014-07-21 12:36:04

标签: c# windows-8 observablecollection inotifycollectionchanged

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

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

所以我真的想知道为什么ObservableCollection得到特殊的'处理,以及INotifyCollectionChange在数据绑定中的作用(如果有的话)

1 个答案:

答案 0 :(得分:1)

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

此外,如果您希望集合中的每个项目在UI中有关项目本身的更改时更新其演示文稿,则表示该项目的类型应实现INotifyPropertyChanged

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

但是,我需要问一下,为什么在Microsoft已经提供了ObservableCollection<T>对象时,你可以推送自己的可观察集合,你可以将其子类化并接收你正在寻找的免费功能?