集合使用反应式扩展更改了事件

时间:2014-03-22 19:43:18

标签: c# system.reactive

我正在尝试使用被动扩展

为ViewModel订阅一个集合
AllTags = tagList.ToObservable(Scheduler.ThreadPool);

这是订阅

subscription = Model.GetAllEntities().Subscribe(x => RefreshAllEntities(x));

我的问题是,如果将某些内容添加到tagList并调用OnNext会发出通知。但是当我从集合中删除一个项目时,如何保持同步。没有通知。请帮助。

1 个答案:

答案 0 :(得分:0)

ToObservable<T>()上调用IEnumerable<T>不会导致跟踪基础集合的更改。

所有ToObservable<T>所做的是从订阅上的源可枚举获取枚举器,并通过它迭代推送元素到订阅者。就是这样。没有跟踪变化。

如果要将更改报告给视图模型,请考虑在视图模型上使用类型为ObservableCollection<T>的属性。 MSDN has a small tutorial here.此实现INotifyCollectionChanged<T>报告对集合的更改,通常用作列表和组合框的ItemSource

此处不需要Reactive Extensions。但是,它通常以两种不同的方式与ObservableCollections一起使用:

  • 通过订阅INotifyCollectionChanged<T>个活动来监控通过用户界面进行的收集更改并做出反应。
  • 订阅外部更新源并根据需要调用ObservableCollection上的Add / Remove;你必须这样做,没有自动更新更新。

在这两方面,ReactiveUI是您可能希望查看的框架,它提供了一些有用的帮助,并增强了ObservableCollection<T>的替代方案。提供的链接是最好的(IMHO)概述,它位于源代码仓库中。示例项目也值得一看。不幸的是,它的文档并不是很好,但原作者Paul Betts对Stack Overflow的问题非常敏感。

从源流发布更改的另一种替代方法是查看Rx的Rxx扩展中的DictionarySubject<T> - 但这有更高的进入门槛,因为文档更少,目前Rxx没有& #39; t已经为新版本的Rx编译了一段时间的已发布下载/包。虽然你可以自己做,但这并不简单。这很遗憾,因为实施非常好。作者Dave Sexton已经提到Rxx的最佳位在某个时候被合并到Rx的意图 - 但是我没有时间框架知道这一点。