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



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

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

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

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

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

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

然而,我需要问的是,当微软已经提供了ObservableCollection<T>对象时,为什么要推出你自己的可观察集合,你可以免费将其子类化并接收你想要的功能?

最新更新