【问题标题】:How to replace CreateDerivedCollection with dynamic data如何用动态数据替换 CreateDerivedCollection
【发布时间】:2019-01-03 10:16:54
【问题描述】:

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

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

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

base.Items collection is of type `ItemCollection`.

我不知道如何用动态数据替换对 CreateDerivedCollection 的调用并保留功能。 MyItems 列表每次都需要更新,然后基础项目集合发生变化。

【问题讨论】:

  • 顺便说一句,不确定 OfType 是否会在旧版本中完成您想要的操作。它不会根据 base.Items 的变化而更新,因为它删除了任何可观察性。

标签: c# wpf dynamic-data reactiveui


【解决方案1】:

本指南介绍了转换的工作原理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&lt;T&gt;,而不是公开自己的类型。

IObservable&lt;IChangeSet&lt;T&gt;&gt;(和IObservable&lt;IChangeSet&lt;TKey, TValue&gt;&gt;)是您可以从中创建派生功能的两个基本可观察对象。 IObservable&lt;IChangeSet&gt;&gt; 表示集合的变化。第一次使用 ToObservableChangeSet() 时,它会发出集合的当前状态。

SourceList&lt;T&gt;SourceCache&lt;TKey, TValue&gt; 具有多线程意识并经过优化以创建 IObservable&lt;IChangeSet&lt;T&gt;&gt;IObservable&lt;IChangeSet&lt;TKey, TValue&gt;&gt;。通常 SourceList/SourceCache 对您的类来说是私有的,并且您使用 Bind() 方法公开。您可以通过对它们使用Connect() 方法来生成更改集。

ObservableCollectionExtended 是一个很好的单线程集合,您不需要执行基于派生的功能。

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多