我有以下代码可以转换wpf TabControl的Items集合中的项目:
public IReadOnlyReactiveList<MyType> MyItems => base.Items.OfType<MyType>().CreateDerivedCollection(_ => _);
IReadOnlyReactiveList
和CreateDerivedCollection
扩展名都被标记为过时。
base.Items collection is of type `ItemCollection`.
我不知道如何用动态数据替换对CreateDerivedCollection的调用并保留功能。 MyItems
列表每次都需要更新,然后更改基本Items集合。
答案 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是一个很好的单线程集合,您无需执行基于派生的功能。