C# 如何以及是否构建复合视图?

C# 如何以及是否构建复合视图?,c#,wpf,mvvm,C#,Wpf,Mvvm,我的申请并不复杂。它从Web服务中检索单个实体,对其进行编辑并将其发回。实体本身相当大,有一些关联和几十个属性。将其视为一个大文档(实际上是一个文档) 我考虑使用多个嵌套视图构建我的应用程序。所以我有一个完整实体的视图和视图模型,但它包含多个不同属性的视图和视图模型。这是一个好方法吗?还是我将来会面临很多问题 另外:我如何连接它们?我是否将嵌套视图的Datacontext绑定到“实体”(“域中的真实”对象)或由所谓的“父”ViewModel创建的ViewModels 我是否应该使用MVVM框架,

我的申请并不复杂。它从Web服务中检索单个实体,对其进行编辑并将其发回。实体本身相当大,有一些关联和几十个属性。将其视为一个大文档(实际上是一个文档)

我考虑使用多个嵌套视图构建我的应用程序。所以我有一个完整实体的视图和视图模型,但它包含多个不同属性的视图和视图模型。这是一个好方法吗?还是我将来会面临很多问题

另外:我如何连接它们?我是否将嵌套视图的Datacontext绑定到“实体”(“域中的真实”对象)或由所谓的“父”ViewModel创建的ViewModels


我是否应该使用MVVM框架,如MVVM Light、Prism或Caliburn.Micro?

无论文档实体有一个视图还是多个子视图,它们最终都应该共享同一个文档实体。如果这只是一个小应用程序,那么表示文档实体的单个视图可能是一个不错的方法

但是,也可以创建一个案例来将实体分解为其组成部分。这将允许您为每个零件创建更易于管理的模型。在这种情况下,您需要使用发布/子模型在实体更新时传递实体,以便在任何其他组件修改实体时使用最新实体更新每个组件零件

如果您决定使用子视图,那么MVVM框架将使其更易于管理。也就是说,即使您使用一个大视图,MVVM框架仍然会为您处理许多基本的管道

我已经使用了您提到的所有三种MVVM框架,并建议使用Caliburn.Micro或MVVM Light。Prism可能有点势不可挡,学习曲线要陡峭得多

编辑

基于您的附加信息,假设:

  • 文档实体由多个复杂属性组成
  • 这些复杂属性中的每一个(大多数)都表示一个子集信息,这些信息可以根据自身的优点进行编辑,即文档元数据、文档作者信息等
然后你可以做一些如下的事情:

  • 为表示文档实体子集的每个复杂属性创建用户控件。每个用户控件都可以有自己的ViewModel,其中包含如何编辑数据的逻辑
  • 创建一个基本视图(Shell)和布局,其中每个用户控件都将被注入其中;对Shell中每个用户控件的容器使用
    ContentControl
    。Shell的ViewModel将负责将各种用户控件注入到每个ContentControls中
  • 创建一个控制器,该控制器将为文档实体执行艰苦的工作,即获取一个新的、更新的等等
  • 当任何用户控件修改数据时,将其发送回控制器,控制器将更新文档实体,然后向所有人广播新实体;这里将使用发布/订阅模型

无论你选择Caliburn.Micro还是MVVM Light,这都无关紧要;它们都为基础管道提供了良好的基础。选择你觉得最舒服的东西。

从复合视图模型中你会得到什么?您想在单独的视图模型中包装的那些属性是否真的那么复杂?如中所示,是否会出现需要对MainViewModel.PropertyX进行更高级修改/处理的情况

如果您的属性归结为您可能设置或不设置的简单值,那么为它们引入新的视图模型听起来有点过分了。让它尽可能简单

然而,如果您的文档的某些部分需要在上下文之外进行编辑(例如,远离它们来自的文档,比如地址信息),或者有多组类似的字段,那么将它们包装到公共视图模型中可能是值得的。这将为你节省一些多余的工作

棱镜,MVVM灯。。? 如果您的应用程序像视图和视图模型一样简单,我会远离Prism。这是一个相当沉重且相当复杂的框架。另一方面,MVVM Light可能是一个不错的主意,即使是为了学习它

编辑:

考虑到您的模型相当庞大,将其拆分是非常有意义的。我还建议为主要实体(文档)所包含的实体创建专用视图模型/视图对。绑定到模型可能听起来很吸引人,但通常你会发现自己后悔这个决定。简单来说:

  • 最有意义的实体的分离视图模型(可以全部使用,但通常是判断调用——“我真的需要为这个实体创建新的视图模型来公开单个字符串属性吗?”)
  • 与视图模型匹配的分离视图
  • 主视图模型(文档)将部分视图模型作为可绑定属性公开
  • 主视图设置局部视图从主视图获取的局部视图模型的数据上下文

有很多属性,所以我真的倾向于在不同的视图中将其拆分。此外,我认为Caliburn的惯例有点限制,mvvm light似乎更适合开始。我用一段补充的话更新了我的问题——我发现很难理解如何连接不同的视图和视图模型。如果有很多复杂的属性可以分解为可管理的部分,那么一定要使用多视图方法。我将更新我的答案,并提供更多信息。我已决定使用MVVM light,并根据您的建议构建我的应用程序。我有一个UI原型,该实体只有一个视图,它有1000多个视图