如何用动态数据替换CreateDerivedCollection

时间:2019-01-03 10:16:55

标签: c# wpf dynamic-data reactiveui

我有以下代码可以转换wpf TabControl的Items集合中的项目:

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

IReadOnlyReactiveListCreateDerivedCollection扩展名都被标记为过时。

base.Items collection is of type `ItemCollection`.

我不知道如何用动态数据替换对CreateDerivedCollection的调用并保留功能。 MyItems列表每次都需要更新,然后更改基本Items集合。

1 个答案:

答案 0 :(得分:2)

本指南详细介绍了转换的工作原理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是一个很好的单线程集合,您无需执行基于派生的功能。