【发布时间】:2020-09-06 18:56:16
【问题描述】:
问题
我们如何从IObservable<IReadOnlyList<T>> 到IObservableList<T>(从DynamicData)?
上下文
我在我的项目中同时使用了Reactive extensions 和DynamicData。
我目前有一个随时间变化的字符串列表。我有IObservable<IReadOnlyList<string>>。它会产生如下更新:
["A", "C", "F"]["A", "B", "C", "F"]["A", "B", "C"]
我想将其转换为IObservableList<string>,它会产生如下更新:
- 在索引 0 处添加“A”、“C”、“F”
- 在索引 1 处添加“B”
- 从索引 3 中删除“F”
我尝试过的
我尝试使用 ToObservableChangeSet 扩展,但它的行为不适合我的情况。
Subject<IReadOnlyList<string>> source = new Subject<IReadOnlyList<string>>();
IObservable<IEnumerable<string>> observableOfList = source;
IObservable<IChangeSet<string>> observableOfChangeSet = source.ToObservableChangeSet<string>();
observableOfChangeSet
.Bind(out ReadOnlyObservableCollection<string> boundCollection)
.Subscribe();
((INotifyCollectionChanged)boundCollection).CollectionChanged += OnCollectionChanged;
source.OnNext(new[] { "A", "C", "F" });
source.OnNext(new[] { "A", "B", "C" });
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Debug.WriteLine($"[{string.Join(", ", (IEnumerable<string>)sender)}] (operation: {e.Action} at index {e.NewStartingIndex})");
}
输出
[A, C, F] (operation: Reset at index -1)
[A, C, F, A] (operation: Add at index 3)
[A, C, F, A, B] (operation: Add at index 4)
[A, C, F, A, B, C] (operation: Add at index 5)
我们可以看到[A, C, F, A, B, C] 与[A, B, C] 不同。
我也尝试过使用EditDiff,但这并不能保留列表的顺序。
Subject<IReadOnlyList<string>> source = new Subject<IReadOnlyList<string>>();
IObservable<IEnumerable<string>> observableOfList = source;
IObservable<IChangeSet<string>> observableOfChangeSet = ObservableChangeSet.Create<string>(list =>
{
return observableOfList
.Subscribe(items => list.EditDiff(items, EqualityComparer<string>.Default));
});
observableOfChangeSet
.Bind(out ReadOnlyObservableCollection<string> boundCollection)
.Subscribe();
((INotifyCollectionChanged)boundCollection).CollectionChanged += OnCollectionChanged;
source.OnNext(new[] { "A", "C", "F" });
source.OnNext(new[] { "A", "B", "C" });
void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Debug.WriteLine($"[{string.Join(", ", (IEnumerable<string>)sender)}] (operation: {e.Action} at index {e.NewStartingIndex})");
}
输出
[A, C, F] (operation: Reset at index -1)
[A, C] (operation: Remove at index -1)
[A, C, B] (operation: Add at index 2)
我们可以看到[A, C, B] 与[A, B, C] 不同。
谢谢!
【问题讨论】:
-
尝试改用 EditDiff。类似github.com/RolandPheasant/DynamicData.Snippets/blob/…
-
@GlennWatson 这几乎成功了!但是,使用
EditDiff不会保留列表的顺序。我已编辑问题以添加该示例。
标签: c# .net system.reactive reactive reactiveui