在MVVM中使用Rx跟踪收集变化

本文关键字:跟踪 变化 Rx MVVM | 更新日期: 2023-09-27 18:18:27

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

VM -> Manager -> Service -> Manager -> VM

当VM加载时,它向管理器请求数据。Manager执行服务调用,获取数据,从dto构造模型集合,将该集合返回给ViewModel,后者将模型集合转换为ViewModel集合在列表中呈现

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

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

但是我想我必须订阅IObservable<Model>,因为我需要一种方法来跟踪个人的变化。我需要一种方法来修改这个集合从其他方法,如添加,删除或编辑。那么我应该通过Observable.Create(或其他方法)创建IObservable并将IObserver存储在管理器中的某个地方以在其他方法中调用OnNextOnError吗?但它看起来不像一个简单的方法。你对我的问题有什么建议吗?任何建议都很感激。谢谢。

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

在MVVM中使用Rx跟踪收集变化

看看ReactiveList<T> -它是ReactiveUI框架的一部分,我们已经使用它在MVVM/WPF ui中取得了很好的效果。

ReactiveList可以工作,尽管它没有公开任何一个提供所有修改事件的Rx流。

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