在Observable Collection上使用LINQ而不丢失事件订阅C#



我正试图使用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属性中的所有更改。

相关内容

  • 没有找到相关文章

最新更新