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();