Как заменить CreateDerivedCollection динамическими данными - PullRequest
0 голосов
/ 03 января 2019

У меня есть следующий код, который преобразует элементы из коллекции Items wpf TabControl:

public IReadOnlyReactiveList<MyType> MyItems => base.Items.OfType<MyType>().CreateDerivedCollection(_ => _);

Оба расширения IReadOnlyReactiveList и CreateDerivedCollection помечены как устаревшие.

base.Items collection is of type `ItemCollection`.

Я не знаю, как заменить вызов CreateDerivedCollection динамическими данными и сохранить функциональность.MyItems список необходимо обновлять каждый раз, когда изменяется базовая коллекция предметов.

1 Ответ

0 голосов
/ 03 января 2019

В этом руководстве рассказывается, как работает преобразование https://reactiveui.net/docs/handbook/collections/

Но подведу итог.

public class MyClass
{
   private readonly ReadOnlyObservableCollection<MyType> _myItems;
   public MyClass()
   {
      base.Items
         // This makes a IObservable<IChangeSet<T>> which describes the changes
         .ToObservableChangeSet()
         // this will make sure you get the MyType
         .Filter(x => x is MyType)
         // This will convert them into MyType instances.
         .Transform(x => (MyType)x)
         // This is mostly only needed if your source allows multi threading
         .ObserveOn(RxApp.MainThreadScheduler)
         // This will make your _myItems keep in sync with what's done above
         .Bind(out _myItems)
         .Subscribe();
   }

   public ReadOnlyObservableCollection<MyType> MyItems => _myItems;
}

Стоит отметить пару вещей.

DynamicData использует типы .NET для представления внешнему миру, например ReadOnlyObservableCollection, а не для представления своих собственных типов.

IObservable> (и IObservable>) - это две базовые наблюдаемые, из которых можно создавать производные функциональные возможности. IObservable> указывает, что изменилось в коллекции. При первом использовании ToObservableChangeSet () он генерирует текущее состояние коллекции.

SourceList и SourceCache поддерживают многопоточность и оптимизированы для создания IObservable> и IObservable>. Обычно SourceList / SourceCache предназначены для ваших классов, и вы предоставляете их с помощью метода Bind (). Вы генерируете наборы изменений, используя для них метод Connect ().

ObservableCollectionExtended - хорошая однопоточная коллекция, в которой вам не нужно выполнять производную функциональность.

...