14

我将 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 并且我在绑定字段中看到它,但顺序没有改变。我是否期望一些不应该发生的事情或者有更好的方法来处理这个?

4

3 回答 3

11

迟到的答案,但在 4.5 中添加了 ListCollectionView(ListBox 和 CollectionViewSource.View 的默认实现)新属性以实现这一点。

您可以使用 IsListSorting 和 ListSortingProperties 来启用自动排序。不,它不会重建视图

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

这应该在属性MyProperty更改时使用。

于 2018-11-08T21:00:54.333 回答
5

我找到的所有答案都提到View.Refresh()了,但这对于大列表来说不是很好的解决方案。我最终做的是Remove()Add()这个项目。然后它被正确地重新定位而不重新加载整个列表。

警告!它适用于我的工作,但在您的情况下,删除对象并重新添加可能会导致副作用,具体取决于您的代码编写方式。在我的情况下,它是一个具有 UI 效果的列表,其中新项目显示为过渡,因此刷新将在整个列表中显示过渡,其中删除/添加很好地显示了项目如何重新定位。

于 2012-07-04T00:42:40.447 回答
5

您是否尝试过刷新您的 collectionviewsource?

    this.TruckSource.View.Refresh();
于 2012-06-30T03:15:49.910 回答