【问题标题】:Data Binding with a Sorted List与排序列表的数据绑定
【发布时间】:2020-10-07 19:56:04
【问题描述】:

我的 UI 有一个绑定到 Collection 的 ListBox。现在这恰好是一个 ObservableCollection

我的目标是通过 UI 向此 Collection 添加对象,并让 ListBox 动态更新,同时保持一个有序的 Collection。

我知道有一些我可以在 WPF 中使用的 SortedView。但这不是我想要的 - 我需要实际的 Collection 保持排序,因为我的业务逻辑需要一个排序的集合。

我想到的一种方法是创建自己的 Collection 类,该类在内部使用 SortedList,并实现 INotifyCollectionChanged 接口并在内部列表更改时产生 NotifyCollectionChangedEventArgs 事件。听起来工作量很大!

有没有我错过的简单解决方案?

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

    根据您的具体需求,最简单的方法是保留您的 ObservableCollection,但包含在 ICollectionView 类型的新属性中:

    public class MyViewModel {
      private CollectionViewSource _collectionViewSource;
    
      public ICollectionView MyCollectionView  => _collectionViewSource.View;
    
      public MyViewModel(ObservableCollection<MyDataItem> dataItems) {
          _collectionViewSource = new CollectionViewSource() { Items = dataItems };
          //Add sorting here using _collectionViewSource.SortDescriptions.Add(...)
      }
    

    您可以根据需要使用 wrapper 属性提取排序列表。

    【讨论】:

      【解决方案2】:

      好的,所以我最终继承了 ObservableCollection,并覆盖了 Add() 方法。 这对我有用。现在我的列表总是排序的,并且 ObservableCollection 是通知 UI 更改的列表。

         public class MyCollection : ObservableCollection<Int32>
         {
            public new void Add(Int32 x)
            {
               base.Add(x);
               var oldList = new ObservableCollection<Int32>(this.OrderBy(c=>c));
      
               Clear();
               foreach(var i in oldList)
               {
                  base.Add(i);
               }
            }
         }
      

      我是 C# 的初学者,欢迎对代码提供任何反馈。

      【讨论】:

      • 这绝对有效,但是对于大量数据,性能不会很好。您将在添加、清除时更新您的视图,并在您再次将它们全部添加回来时为集合中的每个项目更新一次。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2011-04-12
      • 2010-12-14
      • 2021-08-04
      • 1970-01-01
      相关资源
      最近更新 更多