这是我的问题How does WPF handle CollectionChanged events for custom collections?的后续行动。
根据Alex.Wei的回答(以及IndexedEnumerable的源代码),WPF忽略了NotifyCollectionChangedEventArgs
(例如Action
)的细节,并且总是做出相同的反应,最终好像{ {1}}。
所以我的问题是:谁使用Action == Reset
'功能,并且如果我手动引发事件(对于自定义类),指定细节(如果从未评估过)是否有意义?另外,为什么WPF会如此表现-这不是潜在的性能杀手吗?
答案 0 :(得分:1)
我的经验是,如果您在Add
或Remove
动作中提供错误的索引或多个元素,则WPF将引发异常。
除此之外,还有一系列框架(NMF表达式,BindableLINQ,ContinuousLinq,Obtics)利用这些CollectionChanged事件来对查询实现INotifyCollectionChanged
。这些框架将在很大程度上取决于您在事件中添加的详细信息,尽管您当然可以始终诉诸重置事件。
答案 1 :(得分:1)
很抱歉,如果我在上一个答案中没有弄清楚。实际上,WPF会按照NotifyCollectionChangedEventArgs
的特定方式进行操作,就像它的意思一样,并且IndexedEnumerable
只是一种工具,可让CollectionView
或WPF的其他组件访问未访问的源集合通过索引轻松实现IList
。例如,将集合绑定到ItemsControl.ItemsSource
之后,下面的事情就会发生。
ItemsControl
将集合指定为其Items
属性的来源。Items
属性是ItemCollection
,将通过调用CollectionView
方法获得CollectionViewSource.GetDefaultCollectionView
。CollectionChanged
事件并采取相应措施。ItemCollection
还将订阅视图的CollectionChanged
事件并采取相应的行动。ItemsControl
订阅CollectionChanged
的{{1}}事件,并从头开始采取相应行动。因此,对您的问题的答案是,许多WPF类都在使用Items
'功能,并且您肯定需要通过提供所有详细信息来正确地消除NotifyCollectionChangedEventArgs
事件{是否{1}}。
答案 2 :(得分:0)
看看我的ObservableComputations库。该库广泛使用NotifyCollectionChangedEventArgs。