Использование LINQ в наблюдаемой коллекции без потери подписок на события C#
Я пытаюсь использовать LINQ для сортировки ObservableCollection, проблема в том, что методы LINQ возвращают IOrderedEnumerable, и нет метода для преобразования этого типа напрямую в ObservableCollection. После некоторого поиска я обнаружил способ сделать это, используя конструктор из класса ObservableCollection для создания нового с помощью IOrderedEnumerable:
MyObservableCollection = new ObservableCollection<T>(someIOrderedEnumerable);
Однако это не решает мою проблему, потому что при использовании этого конструктора предыдущий обработчик событий EventHandler стирается, поэтому я теряю ссылки на все методы, ранее подписанные на событие CollectionChanged, и повторная подписка на эти методы невозможна.
В настоящее время я очищаю Observable Collection, а затем добавляю объекты, которые были возвращены методом 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]);
}
Главный вопрос: как заказать наблюдаемую коллекцию, не теряя подписки на событие CollectionChanged?
Я подумал о том, чтобы сохранить EventHandler и переназначить его после создания новой отсортированной наблюдаемой коллекции, но пока не смог реализовать это.
Edit1: немного поработав, я нашел решение для методов LINQ, которые только сортируют коллекции, вместо того, чтобы очищать наблюдаемую коллекцию, а затем добавлять одну за другой, вместо этого я просто устанавливаю значения (что не запускает событие CollectionChanged):
var iOrderedEnumerable = MyObservableCollection.SomeLINQMethod();
var pivotList = iOrderedEnumerable.ToList();
for (int i = 0; i < pivotList.Count; i++)
{
MyObservableCollection[i] = pivotList[i];
}
1 ответ
Моя библиотека ObservableComputations может вам помочь. Используя эту библиотеку, ваш код будет выглядеть следующим образом:
ObsevableCollection<Item> orderedObsevableCollection = MyObservableCollection.Ordering(i => i.OrderKey);
ObsevableCollection будет отражать все изменения в MyObservableCollection и свойстве OrderKey всех элементов.