在旧版本的ReactiveUI中具有简单的代码:
var allItems = new ObservableCollection<Model>(items);
var filteredItems = allItems.CreateDerivedCollection(
x => x,
Filter,
Comparer.Compare);
其中Filter
和Compare
具有简单签名:
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用于某些用途,并认为您不介意这种共享。
如果我稍后说的话对您没有帮助,这是我可以找到的最相关的资源:
就我而言,我使用SourceList
或SourceCache
作为类似于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(...);
});
干杯!