【问题标题】:collection changed event using reactive extensions使用响应式扩展收集更改的事件
【发布时间】:2018-11-21 21:00:35
【问题描述】:

我正在尝试使用响应式扩展将集合订阅到 ViewModel

AllTags = tagList.ToObservable(Scheduler.ThreadPool);

这是订阅

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

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

【问题讨论】:

  • 我完全不清楚你在问什么。虽然我了解您通常尝试使用 Rx 监控视图模型上的集合,但您的问题的几个方面尚不清楚。例如。 tagList 的类型是什么?它是如何维护的?同步应该是双向的吗?在 IEnumerable<T>(或 List<T>)上调用 ToObservable 只会遍历列表,将其推送到可观察的流中。没有更新跟踪。请您在问题中添加细节以更清楚地表达它。

标签: c# system.reactive


【解决方案1】:

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

ToObservable<T> 所做的只是从源可枚举订阅 中获取一个枚举器,并通过它迭代将元素推送给订阅者。而已。不跟踪更改。

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

这不需要响应式扩展。但是,它通常以两种不同的方式与 ObservableCollections 一起使用:

  • 通过订阅 INotifyCollectionChanged<T> 事件来监视和响应通过 UI 对集合所做的更改。
  • 订阅外部更新源并酌情在 ObservableCollection 上调用 Add/Remove;您必须这样做,更新不会自动连接。

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

从源流发布更改的另一种方法是查看 Rx 的 Rxx 扩展中的 DictionarySubject<T> - 但这具有更高的进入门槛,因为文档更少,目前 Rxx 还没有为新版本的 Rx 编译了一段时间的已发布下载/包。尽管您可以自己执行此操作,但这并不简单。很遗憾,因为实现非常好。作者 Dave Sexton 曾提到打算在某个时候将 Rxx 的最佳位合并到 Rx 中 - 但我知道没有时间表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多