我的申请并非完全复杂。它从Web服务中检索单个实体,对其进行编辑并将其发回。实体本身相当大,有一些协会和几十个属性。可以把它想象成一个大文档(它实际上是文档)。
我想过使用多个嵌套视图构建我的应用程序。所以我有一个完整实体的视图和视图模型,但它包含多个视图和各种属性的视图模型。这是一个好方法吗?或者我将来会遇到很多问题?
另外:我如何将它们连接起来?我是否将嵌套视图的Datacontext绑定到“实体”(来自域的“真实”对象)或由所谓的“父”ViewModel创建的ViewModel?
我应该使用MVVM Light,Prism还是Caliburn.Micro等MVVM框架?
答案 0 :(得分:3)
无论您是文档实体的一个视图还是文档实体的多个子视图,它们都应该最终共享同一个文档实体。如果这只是一个小应用程序,那么代表文档实体的单个视图可能是一个不错的方法。
但是,也可以将实体分解为其组成部分。这将允许您为每个零件创建更易于管理的模型。在这种情况下,您将需要使用发布/订阅模型来更新实体,以便在任何其他组件修改实体时使用最新实体更新每个组件部分。
如果您决定使用子视图,那么MVVM框架将使其更易于管理。也就是说,即使你有一个大观点,MVVM框架仍然会为你处理很多基本的管道。
我已经使用了你提到的所有三个MVVM框架,并建议使用Caliburn.Micro或MVVM Light。棱镜可能有点压倒性,学习曲线更陡峭。
修改强>
根据您的附加信息,假设:
然后你可以按照以下方式做点什么:
ContentControl
。 Shell的ViewModel将负责将各种用户控件注入每个ContentControls。如果你选择Caliburn.Micro或MVVM Light,这无关紧要;它们都为基础管道提供了良好的基础。选择你觉得最舒服的任何事情。
答案 1 :(得分:2)
您将从复合视图模型中获得什么?您想要在单独的视图模型中包装的那些属性实际上是那么复杂的吗?如果你需要进行更高级的修改/处理,例如,MainViewModel.PropertyX
会不会出现?{/ p>
如果您的属性归结为您可能设置或不设置的简单值,那么为它们引入新的视图模型听起来有点过头了。保持尽可能简单。
但是,如果文档的某些部分有意义在上下文中编辑(例如,远离来自他们来自的文档 - 请考虑例如地址信息),或者有多组相似的字段,那么可能值得将它们包装在通用视图模型中。将为您节省一些多余的工作。
如果你的应用程序像几个视图和视图模型一样简单,我就会远离Prism。它是相当沉重和相当复杂的框架。另一方面,MVVM Light可能是不错的主意,即使是为了学习它。
修改强>
考虑到你的模型非常庞大,拆分它是完全合理的。我还建议为主实体(文档)所包含的实体创建专用的视图模型/视图对。绑定到模型可能听起来很吸引人,但更多时候你会发现自己后悔这个决定。说实话: