从 IReactiveDerivedList 移动到 DynamicData

Move from IReactiveDerivedList to DynamicData

在旧版本的 ReactiveUI 中有简单的代码:

var allItems = new ObservableCollection<Model>(items);
var filteredItems = allItems.CreateDerivedCollection(
 x => x,
 Filter,
 Comparer.Compare);

其中 FilterCompare 具有简单的签名:

private bool Filter(Model item)
public int Compare(Model x, Model y)

有时我会更改其他线程中的项目(大的更改,没有 INPC)或更改 Filter\Compare 策略并只执行 filteredItems.Reset();


在 DynamicData 中,我尝试:

          ReadOnlyObservableCollection<Model> filteredItems;
          var allItems = new ObservableCollection<Model>(items);
          var cancellation = allItems
            .ToObservableChangeSet()
            .Filter(Filter)
            .Sort(Comparer)
            .ObserveOn(SynchronizationContext.Current)
            .Bind(out filteredItems)
            .DisposeMany()
            .Subscribe();

但是没有找到,如何Reset这个^或者filteredItems.

希望我能给你一个直接的答案,但我是 ReactiveUI 的新手。设法将 DynamicData 用于某事,并认为您不会介意此共享。

如果我后面说的对您没有帮助,这里是我能找到的最相关的资源:


在我的例子中,我使用 SourceListSourceCache 作为类似于您的 allItems 的类型。

SourceCache<Model, string> allItems =
    new SourceCache<Model, string>(m => m.Id);

// assuming each model has unique id; if it doesn't then use SourceList

然后我会有一个 BindingList<Model> 作为类似于您的 'filteredItems' 的类型。

BindingList<Model> filteredItems = new BindingList<Model>();

绑定应该是这样的:

allItems
    .Connect()
    ...
    .ObserveOn(...)
    .Bind(filteredItems)
    .Subscribe();

要批量编辑列表,我会这样调用

allItems.Edit(
    innerList => {
    innerList.Clear();

    // edit
    // innerList.AddOrUpdate(...);
});

干杯!