Связывание данных с отсортированным списком - PullRequest
0 голосов
/ 18 июня 2020

В моем пользовательском интерфейсе есть ListBox, привязанный к коллекции. Прямо сейчас это ObservableCollection

Моя цель - добавить объекты в эту коллекцию через пользовательский интерфейс и динамически обновлять ListBox, при этом сохраняя отсортированную коллекцию.

Я знаю что есть SortedView, который я могу использовать в WPF. Но это не то, что я хочу - мне нужно, чтобы фактическая коллекция оставалась отсортированной, потому что для моей бизнес-логики c требуется отсортированная коллекция.

Один из способов, о котором я подумал, - создать свой собственный класс коллекции, который использует a SortedList внутренне и реализует интерфейс INotifyCollectionChanged и создает событие NotifyCollectionChangedEventArgs при изменении внутреннего списка. Похоже, много работы!

Есть простое решение, которое я пропустил?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

В зависимости от ваших конкретных потребностей, самый простой подход - сохранить 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(...)
  }

Вы можете использовать свойство оболочки для извлечения отсортированного списка как необходимо.

0 голосов
/ 18 июня 2020

Хорошо, в итоге я унаследовал от ObservableCollection и переопределил метод Add (). Это помогло мне. Теперь мой список всегда отсортирован, и ObservableCollection - это тот, который уведомляет пользовательский интерфейс об изменениях.

   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#, любые отзывы о коде приветствуются.

...