我正试图使用LINQ对ObservableCollection进行排序,问题是LINQ的方法返回IOrderedEnumerable,并且没有方法将该类型直接转换为ObservableCollection。经过一段时间的搜索,我发现了一种方法,即使用ObservableCollection类中的构造函数,使用IOrderedEnumerable:创建一个新的构造函数
MyObservableCollection = new ObservableCollection<T>(someIOrderedEnumerable);
然而,这并不能解决我的问题,因为通过使用此构造函数,以前的EventHandler被删除,因此我丢失了对以前订阅CollectionChanged事件的所有方法的引用,并且不可能再次订阅这些方法。
目前我正在做的是清除Observable Collection,然后将LINQ方法返回的对象逐一添加到Observable Collection.问题是,每当我使用LINQ订购时,这样做会多次触发CollectionChanged事件:
var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
MyObservableCollection.Clear();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
{
MyObservableCollection.Add(pivotList[i]);
}
主要问题是:如何在不丢失CollectionChanged事件订阅的情况下订购Observable Collection?
我曾想过存储EventHandler,并在创建新的排序Observable Collection后重新分配它,但还没能实现。
第1版:经过一段时间的修补,我为只对集合进行排序的LINQ方法找到了一个解决方案,而不是清除Observable Collection,然后逐个添加,我只是简单地设置值(这不会触发CollectionChanged事件(:
var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
{
MyObservableCollection[i] = pivotList[i];
}
我的库ObservableComputations可以帮助您。使用该库,您的代码将如下所示:
ObsevableCollection<Item> orderedObsevableCollection = MyObservableCollection.Ordering(i => i.OrderKey);
ObservableCollection将反映所有项的MyObservableCollectionandOrderKey属性中的所有更改。