CollectionViewSource не сортирует изменения свойств

Я привязываю ItemsControl к CollectionViewSource. Вот код:

this.Trucks = new ObservableCollection<Truck>();
            foreach (var truck in DataRepository.Trucks.Where(t => t.ReadyDate.Date.Equals(this.Date)))
            {
                this.Trucks.Add(truck);
            }

            this.TrucksSource = new CollectionViewSource { Source = this.Trucks };
            this.TrucksSource.SortDescriptions.Add(new SortDescription("ReadyAddress.Region.RegionNumber", ListSortDirection.Ascending));
            this.TrucksSource.SortDescriptions.Add(new SortDescription("TruckId", ListSortDirection.Ascending));

Когда я изначально связываю - сортировка работает. Когда я добавляю элемент в ObservableCollection - он вставлен в нужное место, это хорошо. Но когда я изменяю свойство, которое я сортирую - этот элемент не переводится в список.

ReadyAddress.Region.RegionNumber правильно поднимает INotifyPropertyChanged, и я вижу его в связанных полях, но порядок не меняется. Ожидаю ли я чего-то, чего не должно быть, или есть лучший способ справиться с этим?

Ответ 1

Все ответы, которые я нашел, упомянули View.Refresh(), но это не очень хорошее решение для больших списков. То, что я закончил, это Remove() и Add() этот элемент. Затем он был правильно перемещен без перезагрузки всего списка.

Осторожно! Он работает для того, что я делаю, но в вашем случае удаление объекта и повторное добавление могут вызвать побочный эффект в зависимости от того, как написан ваш код. В моем случае это список с эффектом пользовательского интерфейса, в котором появляются новые элементы с переходом, поэтому обновление будет показывать переход на весь список, где remove/add прекрасно показывает, как элемент перемещается.

Ответ 2

Поздний ответ, но с 4.5 в ListCollectionView (реализация по умолчанию для ListBox и CollectionViewSource.View) были добавлены новые свойства, чтобы сделать это возможным.

Вы можете использовать IsListSorting и ListSortingProperties, чтобы включить автоматическое восстановление. И нет, это не перестраивает вид

list.SortDescriptions.Add(new SortDescription("MyProperty", ListSortDirection.Ascending));
list.IsLiveSorting = true;
list.LiveSortingProperties.Add("MyProperty");

Это следует прибегать при изменении свойства MyProperty.

Ответ 3

Вы пытались обновить свой коллекционный просмотр?

    this.TruckSource.View.Refresh();