首页 > 解决方案 > 在 Observable Collection 上使用 LINQ 而不会丢失事件订阅 C#

问题描述

我正在尝试使用 LINQ 对 ObservableCollection 进行排序,问题是 LINQ 的方法返回一个 IOrderedEnumerable 并且没有将该类型直接转换为 ObservableCollection 的方法。在搜索了一段时间后,我发现了一种方法,方法是使用 ObservableCollection 类中的构造函数来使用 IOrderedEnumerable 创建一个新的构造函数:

MyObservableCollection = new ObservableCollection<T>(someIOrderedEnumerable);

但是,这并不能解决我的问题,因为通过使用此构造函数,先前的 EventHandler 被删除,因此我丢失了对先前订阅 CollectionChanged 事件的所有方法的引用,并且无法再次订阅这些方法。

目前我正在做的是清除 Observable 集合,然后将 LINQ 方法返回的对象一一添加到 Observable 集合中,问题是每当我使用 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 后重新分配它,但还不能实现这一点。

Edit1:经过一段时间的修改,我想出了一个解决方案,用于只对集合进行排序的 LINQ 方法,而不是清除 Observable 集合,然后一个一个地添加,我只是设置了值(它不会触发 CollectionChanged 事件):

var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
    {
        MyObservableCollection[i] = pivotList[i];
    }

标签: c#linqunity3dobservablecollectioniorderedenumerable

解决方案


我的图书馆ObservableComputations可以帮助你。使用该库,您的代码将如下所示:

    ObsevableCollection<Item> orderedObsevableCollection = MyObservableCollection.Ordering(i => i.OrderKey);

ObsevableCollection 将反映所有项目的 MyObservableCollection 和 OrderKey 属性的所有更改。


推荐阅读