我正在尝试使用被动扩展
为ViewModel订阅一个集合AllTags = tagList.ToObservable(Scheduler.ThreadPool);
这是订阅
subscription = Model.GetAllEntities().Subscribe(x => RefreshAllEntities(x));
我的问题是,如果将某些内容添加到tagList并调用OnNext会发出通知。但是当我从集合中删除一个项目时,如何保持同步。没有通知。请帮助。
答案 0 :(得分:0)
在ToObservable<T>()
上调用IEnumerable<T>
不会导致跟踪基础集合的更改。
所有ToObservable<T>
所做的是从订阅上的源可枚举获取枚举器,并通过它迭代推送元素到订阅者。就是这样。没有跟踪变化。
如果要将更改报告给视图模型,请考虑在视图模型上使用类型为ObservableCollection<T>
的属性。 MSDN has a small tutorial here.此实现INotifyCollectionChanged<T>
报告对集合的更改,通常用作列表和组合框的ItemSource
。
此处不需要Reactive Extensions。但是,它通常以两种不同的方式与ObservableCollections一起使用:
INotifyCollectionChanged<T>
个活动来监控通过用户界面进行的收集更改并做出反应。在这两方面,ReactiveUI
是您可能希望查看的框架,它提供了一些有用的帮助,并增强了ObservableCollection<T>
的替代方案。提供的链接是最好的(IMHO)概述,它位于源代码仓库中。示例项目也值得一看。不幸的是,它的文档并不是很好,但原作者Paul Betts对Stack Overflow的问题非常敏感。
从源流发布更改的另一种替代方法是查看Rx的Rxx扩展中的DictionarySubject<T>
- 但这有更高的进入门槛,因为文档更少,目前Rxx没有& #39; t已经为新版本的Rx编译了一段时间的已发布下载/包。虽然你可以自己做,但这并不简单。这很遗憾,因为实施非常好。作者Dave Sexton已经提到Rxx的最佳位在某个时候被合并到Rx的意图 - 但是我没有时间框架知道这一点。