代码之家  ›  专栏  ›  技术社区  ›  Mizipzor

关于视图模型

  •  3
  • Mizipzor  · 技术社区  · 14 年前

    我正在努力理解 MVVM模式 . 我目前的方法是有一个类,除了它实现之外,没有任何逻辑(重要的) InotifyProperty已更改 . 类只是属性的集合,如果您愿意,它是一个结构,尽可能描述数据的一小部分。我认为这是我的 模型 .

    我编写的大多数WPF代码都是配置所述模型的设置对话框。对话框后面的代码公开了一个返回模型实例的属性。在XAML代码中,我绑定到该属性的子属性,从而直接绑定到模型的属性。因为它实现了inotifyPropertiesChanged,所以工作得很好。我认为这个设置对话框 视图 .

    然而,我还没有真正弄清楚视图模型到底是什么。我读到的文章建议视图模型应该将视图和模型联系在一起,提供模型缺少但仍然很复杂的逻辑来直接进入视图。这是正确的吗?在我的示例中,设置对话框后面的代码是否被认为是 视图模型 ?

    我只是觉得有点迷茫,希望我的同事们能揭穿我的一些假设。我完全偏离轨道了吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Heinzi    14 年前

    由于您的模型完全适合您的视图,即您的视图(设置对话框)可以直接绑定到模型的数据结构,因此您很幸运地处于 需要 视图模型。

    然而,还有许多其他情况并非如此:假设有一个视图是数据库表的直接映射,但您需要一个与此抽象不完全匹配的用户界面。

    以“设置对话框”为例,假设模型直接映射到数据库表 setting_name , setting_value 领域。但是,在您的视图中,您不希望用户填写一些表格;而是希望用户填写一些“用户名”、“邮件地址”等字段。在这种情况下,您可以创建一个视图模型,它公开如下属性: UserName , MailAddress 并在内部将它们映射到您的模型。

        2
  •  1
  •   Mark Seemann    14 年前

    你认为你的 模型 其实是你的 视图模型 . ViewModel是支持该视图的类。它通常有一个针对特定技术(如WPF或Silverlight)的API。

    因此,ViewModel可以具有ICommand属性,以及为数据绑定提供颜色或画笔的属性。它还可以具有控制特定控件是启用还是禁用,还是完全可见的属性。

    所有这些都是面向视图的逻辑,因此生活在视图模型中。

    除了玩具应用,你还需要一个合适的 领域模型 但是您不想用所有这些面向视图的逻辑来污染这个模型。它不属于那里-您可能希望重用域模型来公开Web服务或网站,以及inotifyPropertyChanged、icommand属性和不属于那里的内容。

    域模型是您的 模型 在MVVM模式中。ViewModel提供了 在视图和模型之间。

        3
  •  0
  •   hemp    14 年前

    ViewModel通常用于绑定到那些影响视图的视觉外观和行为的值。在这种特殊情况下,您将进一步抽象您的模型,只表示设置数据,而不表示任何行为。例如,如果您有一个复选框,当选中该复选框时,会使多个滑块无效,则启用/禁用这些滑块的逻辑将由ViewModel提供,而不是视图本身,而不是模型本身。

    查看将设计分解为MVVM的一个有用方法是问问自己,假设我无法与测试中的视图交互,我将如何对视图的行为进行单元测试?通常,您会发现您的大多数行为实际上都与视图捆绑在一起,并且在很大程度上除了功能测试之外是不稳定的。

        4
  •  0
  •   Robert Rossney    14 年前

    这个 模型 是您的数据模型。这个 视图模型 是你的模特吗? 视图 . 这个 视图 是一个 Window Page DataTemplate ,通常在XAML中定义。

    视图和视图模型之间存在紧密耦合。视图中的对象绑定到视图模型的属性。如果更改视图的设计,将更改视图模型的设计。一般来说,视图模型是您使用的 而不是 代码落后。

    视图模型和数据模型之间存在紧密耦合。视图模型实例通常包含对数据模型实例的引用。视图模型的属性更新数据模型实例中的属性,通常是在设置这些属性时。(但不一定。例如,视图模型实现 Command 更新数据模型的基础实例或实现 IEditableObject )

    视图和模型之间的耦合。通常,您可以对模型进行实质性的更改,只要它们不具有用户界面含义,也不需要对视图进行更改。通常,您可以在不影响数据模型的情况下对UI的功能进行实质性更改(除非这些更改实际上需要数据模型中的新功能)。