c# - 在 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];
}
解决方案
我的图书馆ObservableComputations可以帮助你。使用该库,您的代码将如下所示:
ObsevableCollection<Item> orderedObsevableCollection = MyObservableCollection.Ordering(i => i.OrderKey);
ObsevableCollection 将反映所有项目的 MyObservableCollection 和 OrderKey 属性的所有更改。
推荐阅读
- python - 如何迭代函数,以便将输出作为参数迭代传递,直到满足条件
- mysql - 以 MYSQL 二进制数据类型存储 128 位二进制数
- git - 如何创建拉取请求以仅将一个提交从暂存到生产合并?
- python - Tkinter 使用 foo.destroy() 使 gui 空白
- javascript - 异步函数:变量突变有效,重新分配无效。为什么?
- javascript - 将表格中的单元格变成另一个页面的可点击链接?
- javascript - .forEach 验证每个元素而不是整个输入?JS
- mysql - 按日期时间查询表时提高性能
- javascript - 在 WooCommerce 单品中为 jQuery datepicker 添加选择器类
- python - 如何减少火花作业中的“未使用的 Vcore 秒数”?