smn*_*rds 5 c# observablecollection inotifycollectionchanged windows-8
背景:我试图通过实现IEnumerable,INotifyPropertyChanged和INotifyCollectionChanged来推广我自己的可观察集合.它工作正常,但是当我数据绑定时,CollectionChanged事件始终为null.但是,由于我发送了Items []属性更改事件,因此更新了数据绑定属性.所以这让我想知道INotifyCollectionChanged在数据绑定方面有什么意义,因为在我的类中它永远不会被触发,但数据绑定仍然有效(它更新了对集合的所有绑定).
然后我决定再做一些挖掘,并反编译ObservableCollection.当我数据绑定到ObservableCollection时,CollectionChanged事件不像我的实现那样是null.
所以我真的想知道为什么ObservableCollection得到'特殊'处理,以及INotifyCollectionChange在数据绑定中扮演什么角色(如果有的话)
INotifyCollectionChanged可以通过集合来实现,以便当在集合中添加或删除元素时,可以向感兴趣的各方通知这些事件。例如,当您希望显示集合内容的一个ListView或GridView多个其他显示控件在集合内容发生更改(通过添加或删除元素)时更新其显示时,这很有用。更一般地,任何对象都可以将数据绑定到在从集合中添加/删除项目时收到通知的事件,以执行数据绑定组件需要执行的任何操作 - 它不仅仅必须是 GUI 控件。然而,对集合的任何其他操作将导致不会向数据绑定控件/对象发出通知。为了实现这一点,您还需要INotifyPropertyChanged在集合上实现,创建PropertyChanged您还想发布的其他事件以通知数据绑定对象,并在发生相关操作时引发该事件。
此外,如果您希望集合中的每个项目在项目本身发生更改时更新其在 UI 中的呈现,则表示该项目的类型应实现INotifyPropertyChanged.
在我看来,你需要实施你自己的CollectionChanged事件。内置System.Array和/或System.Collections.ArrayList类没有任何与其关联的事件。因此,如果您使用这些类之一作为后备存储,那么在每次添加/删除项目时,您需要确保CollectionChanged为自定义集合实现引发事件。
但是,我需要问,当 Microsoft 已经提供了该对象时,为什么要推出自己的可观察集合ObservableCollection<T>,您可以对该对象进行子类化并免费获得您正在寻找的功能?
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |