2

我有一个使用 MVVM 模式编写的跨平台项目(没有使用特定的框架,只是自己编写的实现)。项目有几个独立的模块,每个模块都有几个页面。每个页面都有 ViewModel 和某种负责面向数据的逻辑(获取、保存、删除、转换等)的管理器。所以数据流看起来是这样的:

虚拟机 -> 管理器 -> 服务 -> 管理器 -> 虚拟机

加载 VM 时,它会向管理器询问数据。Manager 执行服务调用,获取数据,从 DTO 构造模型集合,将此集合返回给 ViewModel,ViewModel 将模型集合转换为要在列表中呈现的 ViewModel 集合。

现在我正在寻找一种使用 Rx 实现这种逻辑的方法。大多数页面都有一个要编辑的主列表(插入、删除、修改的项目)和几个支持集合(某些组合框的提供者可以从中选择值)。支持集合可以通过标准的 async/await 调用或通过将任务转换为 Rx 轻松检索 - 它们没有问题。但可修改的列表是。在不破坏 Rx 逻辑的情况下,我无法弄清楚如何在页面的整个生命周期内跟踪此列表中的更改。我有订阅选项:

  • IEnumerable<Model>
  • Task<IEnumerable<Model>>
  • IObservable<IEnumerable<Model>>

但我想我必须订阅,IObservable<Model>因为我需要一种方法来跟踪个人更改。我需要一种从其他方法(如添加、删除或编辑)修改此集合的方法。那么我应该IObservable通过Observable.Create(或其他方法)创建并存储IObserver在 Manager 内的某个地方以调用OnNextOnError其他方法吗?但它看起来不像是 Rx 的做法。你对我的问题有什么建议吗?任何建议表示赞赏。谢谢。

PS:你可能会说 Rx 不是解决我跟踪可修改列表问题的最佳方法,因为它不是无穷无尽的事件流,我必须自己推送修改,但 Rx 有非常方便的过滤数据和处理错误的方法,所以我'我真的很期待在应用程序中实现它。

4

2 回答 2

1

看一下——它是我们使用 MVVM / WPF UI 效果很好ReactiveList<T>的框架的一部分。ReactiveUI

于 2015-12-27T22:31:30.440 回答
1

ReactiveList 有效,尽管它没有暴露任何提供所有修改事件的单个 Rx 流。

请参阅这个相关问题,答案是使用IObservable<IObservable<Model>>,每个内部可观察对象代表列表中的一个项目,以及它的修改(和删除 - 当它完成时)。

于 2015-12-29T13:30:19.580 回答