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

时间:2012-02-08 15:23:39

标签: c# wpf mvvm

我的申请并非完全复杂。它从Web服务中检索单个实体,对其进行编辑并将其发回。实体本身相当大,有一些协会和几十个属性。可以把它想象成一个大文档(它实际上文档)。

我想过使用多个嵌套视图构建我的应用程序。所以我有一个完整实体的视图和视图模型,但它包含多个视图和各种属性的视图模型。这是一个好方法吗?或者我将来会遇到很多问题?

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

我应该使用MVVM Light,Prism还是Caliburn.Micro等MVVM框架?

2 个答案:

答案 0 :(得分:3)

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

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

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

我已经使用了你提到的所有三个MVVM框架,并建议使用Caliburn.Micro或MVVM Light。棱镜可能有点压倒性,学习曲线更陡峭。

修改

根据您的附加信息,假设:

  • 您的文档实体由多个复杂属性组成。
  • 这些复杂属性中的每一个(大多数)都代表一个可以根据自己的优点进行编辑的信息子集,即文档元数据,文档作者信息等......

然后你可以按照以下方式做点什么:

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

如果你选择Caliburn.Micro或MVVM Light,这无关紧要;它们都为基础管道提供了良好的基础。选择你觉得最舒服的任何事情。

答案 1 :(得分:2)

您将从复合视图模型中获得什么?您想要在单独的视图模型中包装的那些属性实际上是那么复杂的吗?如果你需要进行更高级的修改/处理,例如,MainViewModel.PropertyX会不会出现?{/ p>

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

但是,如果文档的某些部分有意义在上下文中编辑(例如,远离来自他们来自的文档 - 请考虑例如地址信息),或者有多组相似的字段,那么可能值得将它们包装在通用视图模型中。将为您节省一些多余的工作。

Prism,MVVM Light ..?

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

修改

考虑到你的模型非常庞大,拆分它是完全合理的。我还建议为主实体(文档)所包含的实体创建专用的视图模型/视图对。绑定到模型可能听起来很吸引人,但更多时候你会发现自己后悔这个决定。说实话:

  • 最合适的实体的分离视图模型(可以使用 all ,但它通常是判断调用 - “我真的需要这个实体的新视图模型暴露单个字符串属性?“
  • 与视图模型匹配的分隔视图
  • 主视图模型(文档)将部分视图模型公开为可绑定属性
  • 主视图设置部分视图 DataContexts到从主视图中获取的部分视图模型