C# 使用排序列表进行数据绑定

C# 使用排序列表进行数据绑定,c#,wpf,data-binding,C#,Wpf,Data Binding,我的UI有一个绑定到集合的列表框。现在这恰好是一个可观察的集合 我的目标是通过UI向该集合添加对象,并动态更新列表框,同时维护已排序的集合 我知道我可以在WPF中使用一些SortedView。但这不是我想要的——我需要实际集合保持排序,因为我的业务逻辑需要排序的集合 我想到的一种方法是创建自己的集合类,该类在内部使用SortedList,并实现INotifyCollectionChanged接口,并在内部列表更改时生成NotifyCollectionChangedEventArgs事件。听起来有

我的UI有一个绑定到集合的列表框。现在这恰好是一个可观察的集合

我的目标是通过UI向该集合添加对象,并动态更新列表框,同时维护已排序的集合

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

我想到的一种方法是创建自己的集合类,该类在内部使用SortedList,并实现INotifyCollectionChanged接口,并在内部列表更改时生成NotifyCollectionChangedEventArgs事件。听起来有很多工作要做


是否有一个我错过的简单解决方案?

好的,因此我最终继承了ObservaleCollection,并重写了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语言的初学者,非常感谢对代码的任何反馈。

根据您的具体需要,最简单的方法是保留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属性来提取排序列表。

这肯定是可行的,但对于大量数据,性能不会很好。当您为集合中的每个项目添加、清除和再次添加它们时,您将更新视图。