Ran*_*dom 12 .net c# collections observablecollection inotifycollectionchanged
我正在研究为什么在使用IList参数调用CollectionChanged时ObservableCollection/ListCollectionView/CollectionView引发NotSuportedException的原因.
//Throws an exception
private void collectionChanged_Removed(IList items)
{
if (CollectionChanged != null)
CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, items));
}
Run Code Online (Sandbox Code Playgroud)
我找到了几个网页,谈论这个主题,他们建议使用Reset强制完全重绘UI的能力,或者只是简单地调用每个项目CollectionChanged或更具创造性的方式:http://geekswithblogs.net/NewThingsILearned/存档/ 2008/01/16/listcollectionviewcollectionview-犯规支持-notifycollectionchanged与-多items.aspx
我只是找不到为什么?对我来说,为什么会出现这种情况毫无意义.
我们在开发周期的某些时候都有这个缺乏功能的可能性,因为当你想快速添加多个项目时,Add方法只需要大量的开销,任何时候都会实现(.Net 5) ,C#6 ......).
编辑:
在我的具体情况下,我写了自己的课:
public class ObservableList<T> : IList<T>, IList, IEnumerable<T>,
INotifyCollectionChanged
{
public event NotifyCollectionChangedEventHandler CollectionChanged;
//other stuff...
}
Run Code Online (Sandbox Code Playgroud)
并仍然抛出所述NotSupportedException.
受到 VirtualBlackFox 答案的启发,我深入了解了CollectionViewILSpy 中的类。看来缺乏对 Range 操作的支持的主要原因CollectionView是因为内部使用更改日志来集中管理各种待处理的更改并按每个项目分派消息。
就其用途而言,CollectionView可以存储与代表其基础数据的多个 UI 控件同时使用的数千条记录。因此,添加或删除记录必须以原子方式完成,以维护访问视图信息的 UI 控件的完整性。如果不将 CollectionView 的分组、排序和筛选功能传递给使用它的 UI 控件,则无法使用批量更改事件与多个 UI 订阅者同步增量更改。
也CollectionView源于System.Windows.Threading.Dispatcher此问题可能与它如何管理其线程上的工作项有关。调用路径包括一个受保护的ProcessCollectionChanged方法,专门处理 UI 线程上的各个更改。因此,更新范围可能会干扰它用来与使用它的 UI 元素交互的整个线程模型。
我完全同意让通行证的消费者加入CollectionViewtoIList是NotifyCollectionChangedEventArgs愚蠢的。它特别拒绝任何长度为 != 1 的内容并在args.NewItems[0]内部进行硬编码。