[英]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.