在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
存储在管理器中的某个地方以在其他方法中调用OnNext
或OnError
吗?但它看起来不像一个简单的方法。你对我的问题有什么建议吗?任何建议都很感激。谢谢。
PS:你可能会说Rx不是解决我跟踪可修改列表问题的最佳方法,因为它不是无尽的事件流,我必须自己推动修改,但Rx有非常方便的过滤数据和处理错误的方法,所以我真的很期待在应用程序中实现它。
看看ReactiveList<T>
-它是ReactiveUI
框架的一部分,我们已经使用它在MVVM/WPF ui中取得了很好的效果。
ReactiveList可以工作,尽管它没有公开任何一个提供所有修改事件的Rx流。
看这个相关的问题,答案是使用IObservable<IObservable<Model>>
,每个内部观察对象代表列表中的一个项目,以及它的修改(和删除-当它完成时)。