簡體   English   中英

在可觀察集合上使用 LINQ 而不會丟失事件訂閱 C#

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM