监控和投影数组的ObservableCollection

在开发WPF应用程序时,经常需要处理数据集合的变化。当集合的数据源是一个数组,并且这个数组不断地被外部因素修改时,面临着一个挑战:如何在不重置ItemsControl的ItemsSource的情况下,及时地通知集合的变化。本文将介绍一种解决方案,该方案通过创建一个继承自ObservableCollection的子类来实现,同时在后台运行一个工作线程来监控底层数组的变化,并将变化的项目同步到ObservableCollection中。

WPF中,ItemsControl控件依赖于数据集合的INotifyCollectionChanged接口来通知数据的变化。然而,如果数据源是一个数组,并且数组的内容被外部修改,那么ObservableCollection的构造函数会复制数组元素,并在通过ICollection接口修改副本时发出CollectionChanged事件。但是,如果生成的数组本身被修改了,会发生什么呢?如果要观察的是生成的数组本身,而不是某个副本,又该怎么办呢?

为了解决这个问题,创建了一个继承自ObservableCollection的子类,它保留了对底层数组的引用,而不是副本。在固定的时间间隔(检查点)内,它会检查底层数组的内容,并更新其实例,使其与数组同步。此外,解决方案还考虑了数组可能包含大量项目的情况。通过使用.NET v4中的并行处理类,可以高效地监控这个数组,即使它包含数百万的元素。

代码使用

提供了扩展方法,以便可以像这样包装数组:

int[] theArray = new int[1000000]; for (var i = 0; i < theArray.Length; i++) theArray[i] = i; var mon = theArray.AsMonitored(); var monProj = theArray.AsMonitoredProjected(i => i * i);

其中,AsMonitored()方法每100毫秒监控底层数组的T类型,AsMonitored(int period)方法每period毫秒监控底层数组的T类型,AsMonitoredProjected(Func project)方法每500毫秒监控底层数组的T类型,同时将其投影到类型P上;AsMonitoredProjected(Func project, int period)方法每period毫秒监控底层数组的T类型,同时将其投影到类型P上。

实现集合的主要类叫做MonitoredProjectedArray。

public class MonitoredProjectedArray : ObservableCollection
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485