繁体   English   中英

一个模型实体,多个页面->多个视图? 多个ViewModel?

[英]One Model Entity, Multiple Pages -> Multiple Views? Multiple ViewModels?

由于屏幕空间有限,我将使用多个页面(连续显示-思考向导)捕获单个实体的用户输入。 在我的模型中,我希望将此实体建模为单个类是正确的。

在MVVM实现中,我假设将每个页面视为一个单独的View是最佳的MVVM实践。 这个对吗?

是否在每个页面都有自己的ViewModel上是否存在关于最佳MVVM的共识,还是应该有一个由多个Pages引用的ViewModel实例?

为了显示:

选项1

Class A (X, Y, Z)
ViewModelA1 (X)
ViewModelA2 (Y)
ViewModelA3 (Z)
View1 captures ViewModelA1
View2 captures ViewModelA2
View3 captures ViewModelA3

选项2

Class A (X, Y, Z)
ViewModelA (X, Y, Z)
View1 captures ViewModelA.X
View2 captures ViewModelA.Y
View3 captures ViewModelA.Z

“查看”一词说明了一切。 这是数据视图。 ViewModel的工作是使来自模型的数据可显示。 数据需要做的任何事情都发生在视图模型中,以便视图可以显示它。

通常,视图与视图模型之间存在一对一的关系,因为通常您只想以一种方式显示该数据。 (一个“视图”)我偏离常规做法(可能是MVP模式?)的地方是,如果您想以多种不同的方式显示数据(例如,您想要条形图或折线图,或者饼图),并且所有视图的数据都相同,那么您只需要一个viewmodel。 这是DRY原则的案例。 如果您有三个视图模型并且它们都相同,则使用一个视图模型。 多个视图。 一个视图模型。

我敢肯定有些人会以一种或另一种方式强烈争论。 从我的角度来看,这完全取决于您需要重用哪些代码。 既有以视图为中心的方式又有以模型为中心的方式来构建ViewModel,并且我认为这两种方法都不总是正确的方法。

如果您发现ViewModels倾向于使用特定于UI的逻辑,则良好的设计将倾向于Views与ViewModels之间的1:1关系,每个ViewModel都包含多个Models。 这种方法的危险在于,您可能需要花费大量代码将每个ViewModel中的数据连接起来并保持同步,因此需要在每个ViewModel上重复进行此连接。 Uggh。

但是,您可能还会遇到一种情况(就像我在当前项目中所做的那样),其中ViewModel必须处理基础模型中的复杂关系,并且可以从多个端点(即用户或用户)更新各种Model实体。双工WCF服务)。 在这种情况下,您需要在每个ViewModel中花费大量时间,以确保其数据与基础模型同步,并且在每个ViewModel中重新执行所有逻辑是很愚蠢的。 在这种情况下,我发现最干净的方法是让您的ViewModels或多或少地以1:1映射模型,并在多个视图中重复使用。 这种方法的缺点是,您最终可能会从混合到同一类的各种不同视图中获得许多特定于UI的代码,这会使测试和维护变得困难。 (是的,我知道ViewModels应该不与任何特定的UI紧密结合,但是您仍然会得到很多代码,实际上,“当用户执行此命令时,它绑定到我我假装不知道,做其他我不知道会导致出现对话框的事情。“即使在这种抽象级别,编码到ViewModel中的逻辑也会有所不同。视图到视图。)

然后是各种混合方法,这些方法在现实世界中可能是最有用的。 例如,您可能最终在视图模型中采用了继承层次结构,以便处理一个或多个基类中的通用连接,然后在继承链中的下一个类中添加特定于UI的部分。

对于它的价值,我对大多数MVVM文章的不满之一是,它们所处理的过于简单的场景无法反映您在现实世界中发现的复杂性。 一旦您通过了客户->订单-> OrderDetail之类的表格,我发现我阅读的大多数建议都趋于崩溃,我自己走了自己的路。

教给我有关MVVM的相关最佳实践(和实践):

  • 每个页面/视图都有一个ViewModel。

  • ViewModel应该仅具有与使用它们的View相关的字段/属性。

  • 可以根据需要从多个基础逻辑模型/类中组合ViewModel。

上面可以提供更多模型,但是随着时间的推移它们将更易于使用,因为对单个View / ViewModel所做的更改不会影响其他View或ViewModel。

这符合您的第一个选择

在MVVM实现中,我假设将每个页面视为一个单独的View是最佳的MVVM实践。 这个对吗?

是的,我会根据它的复杂程度来这样做。 我认为大多数WP7应用程序的MVVM只是一个过大的选择。

选项1是更好的模型。

我不确定X,Y和Z是什么意思。

您只需将模型的相同实例传递给每个ViewModel

Class Model
{
  string X { get;set;}
  string Y { get;set;}
  int Z { get;set;}
}

Class MainViewModel
{
  // constructor
  ViewModel()
  {
    model = new Model()
    SubViewModel = new SubViewModel(model);
  }

  Model model {get;set;}
  SubViewModel sub { get;set;}

}

Class SubViewModel
{
  // ctor
  SubViewModel(Model model)
  {
    this.model = model;
  }

  Model model { get;set;}
}

MainViewModel处理每个SubViewModel之间的导航,但是它们都在查看Model的相同实例,因此它们都具有相同的数据。

在某些任务上,我可能具有与单个ViewModel和该任务的多个视图关联的多个模型。 例如,创建具有分组,图像等的产品。专注于产品。

我也有一些Task,其中Task通过多个View驱动使用多个ViewModel。 例如,在应用程序中创建用户帐户,该应用程序具有多个第三方帐户(如Facebook,Twitter等)的混搭,其中每个第三方API都有其自己的一组要求,但通过一系列步骤对用户显示为单个任务。 重点关注用户帐户。

MVVM模式根据需要是灵活的。 定义任务,将其分解,然后确定最适合该任务的任务。

看,你在问什么?
我有100万
我有3个 (假设最好创建3 V)。

我应该有1个VM还是3个VM? 换句话说,您问虚拟机概念在哪一侧更接近 在M边还是V边?

从我的经验迄今与模式,虚拟机是密切相关的V.

因此,您的问题的快速答案是:3个VM(Option1)。 选项2是思考此模式的错误方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM