Использование LINQ в Observable Collection без потери подписок на события C# - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь использовать LINQ для сортировки ObservableCollection, проблема в том, что методы LINQ возвращают IOrderedEnumerable, и нет способа конвертировать этот тип непосредственно в ObservableCollection. После поиска некоторое время я нашел способ сделать это с помощью конструктора из класса ObservableCollection для создания нового с использованием IOrderedEnumerable:

MyObservableCollection = new ObservableCollection<T>(someIOrderedEnumerable);

Однако это не решает мою проблему, потому что с помощью этого конструктора предыдущий EventHandler удаляется, поэтому я теряю ссылки на все методы, ранее подписанные на событие CollectionChanged, и повторная подписка этих методов невозможна.

В настоящее время я очищаю коллекцию Observable, а затем добавляю объекты которые были возвращены методом LINQ один за другим в Observable Collection, проблема заключается в том, что это вызывает многократное срабатывание события CollectionChanged всякий раз, когда я использую LINQ для его упорядочения:

var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
MyObservableCollection.Clear();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
  {
      MyObservableCollection.Add(pivotList[i]);
  }

Основной вопрос: как мне заказать коллекцию Observable без потери подписок на событие CollectionChanged?

Я думал о сохранении EventHandler и переназначении его после создания новой отсортированной коллекции Observable, но не и до сих пор могу это реализовать.

Edit1: После некоторого перебора я нашел решение для методов LINQ, которые только сортируют коллекции, вместо очистки Observable Collection и добавления одного за другим, я просто устанавливаю значения вместо (который не запускает событие CollectionChanged):

var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
    {
        MyObservableCollection[i] = pivotList[i];
    }

1 Ответ

0 голосов
/ 13 апреля 2020

Моя библиотека ObservableComputations может помочь вам. Используя эту библиотеку, ваш код будет выглядеть следующим образом:

    ObsevableCollection<Item> orderedObsevableCollection = MyObservableCollection.Ordering(i => i.OrderKey);

ObsevableCollection будет отражать все изменения в свойствах MyObservableCollection и OrderKey всех элементов.

...