我正在尝试使用 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];
}