【问题标题】:CollectionViewSource does not re-sort on property changeCollectionViewSource 不会在属性更改时重新排序
【发布时间】:2012-07-01 12:45:53
【问题描述】:

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

【问题讨论】:

  • WPF 4.5 中有一个新特性叫做 liveShaping,可以解决这个问题,但是如果你不想调用 Refresh,可能暂时只能使用 LPL 链接的方法。跨度>
  • 我可以通过简单地在公开视图的属性上调用 PropertyChanged 来解决此问题,让视图刷新(并清除排序),然后添加排序描述。

标签: c# wpf binding mvvm collections


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

        this.TruckSource.View.Refresh();
    

    【讨论】:

    • 是的,但我不喜欢它——它刷新了整个视图
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      相关资源
      最近更新 更多