Я пытаюсь использовать 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];
}