C# 使用反应式扩展的集合更改事件

C# 使用反应式扩展的集合更改事件,c#,system.reactive,C#,System.reactive,我正在尝试使用被动扩展向ViewModel订阅一个集合 AllTags = tagList.ToObservable(Scheduler.ThreadPool); 这是订阅 subscription = Model.GetAllEntities().Subscribe(x => RefreshAllEntities(x)); 我的问题是,如果在标记列表中添加了某个内容并调用OnNext,则会发出通知。但当我从集合中删除一个项目时,如何保持同步。没有通知。请提供帮助。在IEnumerab

我正在尝试使用被动扩展向ViewModel订阅一个集合

AllTags = tagList.ToObservable(Scheduler.ThreadPool);
这是订阅

subscription = Model.GetAllEntities().Subscribe(x => RefreshAllEntities(x));
我的问题是,如果在标记列表中添加了某个内容并调用OnNext,则会发出通知。但当我从集合中删除一个项目时,如何保持同步。没有通知。请提供帮助。

IEnumerable
上调用
ToObservable()
不会导致对基础集合更改的任何跟踪

ToObservable所做的一切就是在订阅时从源枚举中获取一个枚举数,并通过它进行迭代,将元素推送到订阅服务器。就这样。不跟踪更改

如果您想要将其更改报告给视图模型的集合,请考虑在视图模型上使用类型<代码> StababCeleCopys<代码>的属性。这实现了报告集合更改的功能,通常用作列表和组合框的

ItemSource

此操作不需要被动扩展。但是,它通常以两种不同的方式与ObservableCollection一起使用:

  • 通过订阅
    INotifyCollectionChanged
    事件,监视并响应通过UI对集合所做的更改
  • 订阅外部更新源,并根据需要在ObservableCollection上调用Add/Remove;您必须这样做,因为没有自动连接更新
在这两方面,都是一个您可能希望看到的框架,它在这里提供了一些有用的帮助,并增强了
ObservableCollection
的替代方案。提供的链接指向位于源代码repo中的最佳(IMHO)概述。示例项目也值得一看。不幸的是,它的文档不是很好,但是最初的作者Paul Betts对堆栈溢出的问题非常敏感


从源代码流发布更改的另一种选择是查看Rx扩展中的
DictionarySubject
,但这有更高的进入门槛,因为文档更少,而且Rxx目前已经有一段时间没有为Rx的新版本编译发布下载/包了。虽然你可以自己做,但这并不简单。很遗憾,因为实现非常好。作者戴夫·塞克斯顿(Dave Sexton)曾提到,Rxx的最佳比特将在某个时候被合并到Rx中,但我知道这没有时间表。

我根本不清楚你在问什么。虽然我知道您通常试图使用Rx监控视图模型上的集合,但您的问题的几个方面还不清楚。例如,
标记列表的类型是什么?它是如何维护的?同步应该是双向的吗?在
IEnumerable
(或
List
)上调用
ToObservable
,仅仅是在列表中迭代,将其推到可观察的流中。没有对更新的跟踪。请你在你的问题中添加细节,使其表达得更清楚。