我正在迈出MvvmCross框架的第一步,我正在尝试在项目和类结构方面决定最佳方法。 我现在最关心的是决定如何组织我的视图模型以便在它们之间共享数据,同时遵循mvvm指南。
我有一个简单的例子来查看视图和相应的视图模型(主要和配置)。主视图具有绑定到viewmodel中的属性的一些控件。配置视图使用户能够更改文本颜色,列表中的项目数等...当用户更改配置时,这应该反映在主视图中。
我的第一个方法是创建单独的视图和视图模型。但是,如何通知主视图配置已更改? 我在Github/Slodge下看到了Sphero项目,我意识到视图模型可以直接引用其他视图。通过这种方式,每次配置更改时都很容易通知主视图。但这不是mvvm推荐的解耦视图模型的偏差吗?
我可以获得一些有关处理此类类结构的最佳方法的见解吗?
答案 0 :(得分:7)
接近这种类型结构的最佳方法
在我看来,“最佳方式”最重要的衡量标准是选择一种意味着您的应用有效的方式。
你看过的例子 - sphero ball control - 有独立视图模型(home,gangnam,about,sphero等)的例子,它有一些相互了解的视图模型的例子 - sphero视图模型及其子视图模型。
在这种特殊情况下,这些视图模型彼此了解的原因是因为它们都是单个显示的一部分 - 它们被设计为在单个网格,数据透视或选项卡式UI中放置在一起。为了帮助他们合作我通过IParent和IChild接口给了他们彼此的引用。
这不是mvvm推荐的解耦视图模型的偏差吗?
我承认这确实意味着设计没有完全解耦,如果我将来需要移动或重用那些子vm,那么我可能需要做一些代码重构 - 但是现在设计工作对我来说很好,如果我需要的话,我个人很高兴将来会进行重构。
我现在最关心的是决定如何组织我的视图模型以便在它们之间共享数据,同时遵循mvvm指南
如果您正在构建复合(选项卡式)视图,并且您不满意使用聚合视图模型(如sphero vm及其子视图),那么请不要。
我确信在使用一个大视图模型的sphero中可以实现相同的效果,使用通过信使进行通信的多个视图模型或使用通过一个或多个自定义服务进行通信的多个视图模型。
对于您给出的特定示例 - 配置和主视图,我认为这不符合选项卡式方案 - 我可能会使用信使编码 - 这将为我提供灵活的广播和接收机制更改应用程序各个部分的通知。
然而,其他设计绝对可用且可行 - 例如,您可以轻松地要求视图模型在每次显示时刷新其配置(这样做需要挂钩到onnavigatedto,viewwillapear和视图中的resume调用)。
总结:
答案 1 :(得分:2)
在我使用MvvmCross构建的项目中,我决定使用viewmodels来表示视图(屏幕)及其状态。我的viewmodels使用ISQLiteConnectionFactory连接到SQLite数据库。我使用存储在SQLite数据库中的模型来表示项目中的事物状态。我的视图模型从SQLite数据库中获取模型,分析它们并做出反应。
实施例。我有一个屏幕,用户可以标记他/她想要在设备上下载一些数据。我的模型有一个标志,表明该数据是应该下载还是已下载。当我打开另一个负责下载数据的屏幕时,它会查看SQLite,因为任何模型都标记为下载并对其作出反应。
这就是我决定在viewmodels之间共享数据的方式。优点是数据始终保存在数据库中,强制关闭应用程序不会导致数据丢失(或者没有按预期发生的事情)。