从 IReactiveDerivedList 移动到 DynamicData
Move from IReactiveDerivedList to DynamicData
在旧版本的 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 用于某事,并认为您不会介意此共享。
如果我后面说的对您没有帮助,这里是我能找到的最相关的资源:
- https://floatingcube.com/blog/convert-reactive-list-to-dynamic-data/
- https://github.com/reactiveui/DynamicData/wiki/Introduction-for-ReactiveUI-users
- https://github.com/reactiveui/DynamicData/issues/182
- https://habr.com/en/post/454074/
在我的例子中,我使用 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(...);
});
干杯!
在旧版本的 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 用于某事,并认为您不会介意此共享。
如果我后面说的对您没有帮助,这里是我能找到的最相关的资源:
- https://floatingcube.com/blog/convert-reactive-list-to-dynamic-data/
- https://github.com/reactiveui/DynamicData/wiki/Introduction-for-ReactiveUI-users
- https://github.com/reactiveui/DynamicData/issues/182
- https://habr.com/en/post/454074/
在我的例子中,我使用 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(...);
});
干杯!