如何以及是否构建复合视图
本文关键字:构建 复合 视图 是否 | 更新日期: 2023-09-27 18:23:52
我的应用程序并不完全复杂。它从Web服务中检索单个实体,对其进行编辑并将其发回。这个实体本身相当大,有一些关联和几十个属性。把它想象成一个大文档(实际上就是文档)。
我曾想过使用多个嵌套视图来构建我的应用程序。因此,我有一个完整实体的视图和视图模型,但它包含多个不同属性的视图和模型。这是个好办法吗?还是我将来会面临很多问题?
另外:我该如何把它们连接起来?我是否将嵌套视图的数据内容绑定到"实体"(域中的"真实"对象)或由所谓的"父"ViewModel创建的ViewModel?
我应该使用MVVM框架,如MVVM Light、Prism或Caliburn.Micro吗?
无论您有一个文档实体的视图还是多个子视图,它们最终都应该共享同一文档实体。如果这只是一个小型应用程序,那么表示文档实体的单个视图可能是一种不错的方法。
但是,也可以将实体分解为其组成部分。这将允许您为每个零件创建更易于管理的模型。在这种情况下,您将希望在实体更新时使用发布/子模型来传递实体,以便在任何其他组件修改实体时,使用最新的实体更新每个零部件。
如果您决定使用子视图,那么MVVM框架将使其更易于管理。也就是说,即使您使用一个大视图,MVVM框架仍然会为您处理许多基本的管道。
我已经使用了你提到的所有三个MVVM框架,并建议使用Caliburn.Micro或MVVM Light。Prism可能有点势不可挡,而且学习曲线要陡峭得多。
编辑
基于您的附加信息,假设:
- 您的文档实体由几个复杂的属性组成
- 这些复杂属性中的每一个(大多数)都表示一个子信息集,这些信息集可以根据自己的优点进行编辑,即文档元数据、文档作者信息等
然后你可以做一些类似的事情:
- 为表示文档实体子集的每个复杂属性创建用户控件。每个用户控件都可以有自己的ViewModel,其中包含如何编辑数据的逻辑
- 创建一个基本视图(Shell)和布局,其中每个用户控件都将被注入;对Shell中每个用户控件的容器使用
ContentControl
。Shell的ViewModel将负责将各种用户控件注入到每个ContentControls中 - 创建一个控制器,为文档实体做艰苦的工作,即获取一个新的、更新等
- 当任何用户控件修改数据时,将其发送回控制器,控制器将更新文档实体,然后向所有人广播新实体;这就是您将使用pub/sub模型的地方
如果你选择Caliburn.Micro或MVVM Light,那真的没关系;它们都为基础管道提供了良好的基础。选择你觉得最舒服的。
您将从复合视图模型中获得什么?那些你想包装在单独视图模型中的属性真的很复杂吗?与中一样,在某些情况下,您是否需要对MainViewModel.PropertyX
进行更高级的修改/处理?
如果你的属性可以归结为你可能设置或不设置的简单值,那么为它们引入新的视图模型听起来有点太过分了。尽量简单。
然而,如果文档的某些部分被断章取义地编辑是有意义的(如在中,远离它们来自的文档,例如地址信息),或者有多组相似的字段,那么将它们封装在公共视图模型中可能是有价值的。这将为你节省一些多余的工作。
棱镜,MVVM灯
如果你的应用程序像几个视图和视图模型那样简单,我会远离Prism。这是一个相当沉重且相当复杂的框架。另一方面,MVVM Light可能是一个不错的主意,即使是为了学习它。
编辑:
考虑到您的模型非常庞大,将其拆分是完全合理的。我还建议为您的主要实体(文档)所包含的实体创建专用的视图模型/视图对。绑定模型听起来可能很有吸引力,但通常你会发现自己后悔这个决定。简单地说:
- 最有意义的实体的分离视图模型(可以使用all,但通常是判断调用-"我真的需要为这个实体提供新的视图模型来暴露单个字符串属性吗?")
- 分离视图匹配视图模型
- 主视图模型(文档)将局部视图模型开为可绑定属性
- 主视图将局部视图DataContexts设置为取自主视图的局部视图模型