[英]Using LINQ on Observable Collection without losing Event subscriptions 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 集合后重新分配它,但还没有能够实现这一点。
Edit1:经过一段时间的修补后,我想出了一个只对集合进行排序的 LINQ 方法的解决方案,而不是清除 Observable 集合,然后一个一个地添加我只是简单地设置值(它不会触发 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);
ObsevableCollection 将反映所有项目的 MyObservableCollection 和 OrderKey 属性中的所有更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.