Наблюдаемая коллекция не осуществляет сортировку, по той простой причине, что каждый раз, когда элемент перемещается из одного места в списке в другое, коллекция вызывает событие. Это было бы замечательно для просмотра анимации алгоритма сортировки в действии, но это было бы отстойно, вы знаете, для сортировки.
Есть два способа сделать это; они очень похожи, и оба начинают с сортировки предметов за пределами своей наблюдаемой коллекции, например если _Fruits
является ObservableCollection<Fruit>
, и вы определили IComparer<Fruit>
для сортировки, вы должны сделать:
var sorted = _Fruits.OrderBy(x => x, new FruitComparer());
Это создает новый IEnumerable<Fruit>
, который при переборе по нему будет иметь объекты в новом порядке. Есть две вещи, которые вы можете сделать с этим.
Один из них - создать новую коллекцию, заменить старую и заставить все элементы управления в пользовательском интерфейсе повторно выполнить привязку к ней:
_Fruits = new ObservableCollection<Fruit>(sorted);
OnPropertyChanged("Fruits");
(Предполагается, что ваш класс реализует INotifyPropertyChanged
обычным способом.)
Другой способ - создать новый отсортированный список, а затем использовать его для перемещения элементов в вашей коллекции:
int i = 0;
foreach (Fruit f in sorted)
{
_Fruits.MoveItem(_Fruits.IndexOf(f), i);
i++;
}
Второй подход - это то, что я бы попробовал, только если бы у меня было действительно серьезное обязательство не связывать элементы управления элементами, потому что это вызовет массу событий, измененных коллекцией.