【问题标题】:MVVM duplicating Model properties in ViewModelMVVM 在 ViewModel 中复制模型属性
【发布时间】:2012-06-29 13:44:00
【问题描述】:

似乎有一个指导意见,即模型不应将其实体暴露给 View,并且所有必需的属性都应在 ViewModel 中复制

例子:

Product
Id {get; set;}
Name {get; set;}
.......


ProductViewModel : ViewModelBase
Id {get; set;}
Name {get; set;}
.......

为什么需要这样做?如果 Model 没有实现 INPC,我可以理解这一点,但如果它实现了,那么我觉得这完全没有必要。

【问题讨论】:

    标签: mvvm


    【解决方案1】:

    当视图绑定到模型时:

    • 如果视图需要更改或者您有多个视图,对模型的更改将导致绑定到该模型的所有视图发生更改。

    • 从 View 的角度来看,它绑定的对象可能不是那么直观;当您需要向对象添加属性和/或命令时,您是将它们添加到 ViewModel 并在模型中保留“原始”属性还是修改模型?

    拥有 ViewModel 可为您提供单个模型和多个(版本)视图之间的额外抽象

    总而言之,这只是一个指导方针,但请注意,当您需要修改/更新应用程序时,今天看起来还不错的东西可能不是那么好。

    【讨论】:

    • 我认为模型是由外部源(代理类、存储库、流)提供的任何东西,仅当我希望通过更改绑定到它的内容来更新视图时才需要 INPC。在我的回答中,我从不将模型绑定到视图,这就是 ViewModel 的用途。
    • 您好 Erno,抱歉回复晚了,我正在度假。你的第一点很强。第二点的答案是:是的。如果我可能会问这个问题:如果您需要有关客户的简短信息,例如仅代码、名称和 ID,您是否有一个只有这三个属性的 CustomerBasicInfoViewModel,使用完整的客户对象作为 DTO(具有所有属性),或者您会模型中也有 CustomerBasicInfo,以保留内存?
    • 一如既往:视情况而定。在 WPF(桌面应用程序)中,我不会担心几(千)字节的内存,但我会首先担心带宽。大多数情况下,决定对象大小的是带宽。
    【解决方案2】:

    指导,就是这样。这取决于手头的情况。纯粹主义者会争辩说,将模型与视图完全分开可以让模型在不改变视图的情况下改变。

    如果必须,我倾向于只代理模型属性(INPC 或某些特定于视图的逻辑,例如模型具有 FirstName 和 LastName 但没有 FullName)

    否则我绑定到模型(这是 ViewModel 上的公共属性)。如果我的情况发生变化并且我需要封装一些东西,那么我会在需要时进行重构。

    我总是尽量确保有一个 ViewModel(即使它只公开模型),以便以后重构更容易。

    【讨论】:

    • 嗨,亚当,抱歉回复晚了,我正在度假。那么,您将如何处理需要在发票视图上显示客户集合的情况,其中只需要非常基本的信息(例如代码、名称和 ID)。您的模型中有 CustomerBasicInfo,还是...?
    • 通常模型是由您的域、Web 服务等指定给您的。因此您创建一个视图模型来包装模型并使视图更容易呈现数据(例如添加属性,如 selected、可见等)。如果您有一个只读视图并且您的模型与视图结构足够相似,那么您可以随时使用它,并在您的规格发生变化时将其替换为视图模型。小心不要让 UI 问题蔓延到您的模型中
    【解决方案3】:

    我的问题是,您的模型为什么要实施 INPC?他们需要吗?

    通常模型只是一个 DTO,不需要任何更改逻辑。

    此外,如果您的 INPC 的基本实现来自 MVVM 框架,但您的模型存在于共享程序集中,那么该程序集是否需要引用您的 MVVM 框架,并且可能还需要其他 WPF 程序集?

    我们的场景是一组共享对象,它们在服务器端和客户端都表示我们的数据。客户端是 WPF 应用程序,这很好,但服务器端是服务,所以我们不需要 INPC。

    【讨论】:

    • 嗨,Cameron,抱歉回复晚了,我正在度假。好吧,必须有人实现 INPC,无论是 Customer (Model) 还是 CustomerViewModel。我们是否在每种情况下都需要 DTO?如果你想从 Model 中引入对 MVVM 框架的引用,你可以,但不是必须的。 INPC 的实现非常简单。 MVVM 框架中的 ViewModelBase 仍将用作 VIewModels 的基础。我的问题是这样的:如果我问一个问题“我应该在 VM 中复制所有模型属性”,答案是肯定的,无论应用程序类型如何,我都想知道 - 为什么?
    【解决方案4】:

    您的 ViewModel 不正确。 如果你已经有一个 Product 类型的模型,你可以简单地在你的 ViewModel 中定义这样的东西: 公共产品产品 {...}

    【讨论】:

    • 这是他问题的核心!将模型暴露给视图会绕过视图模型的责任。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2013-06-13
    • 2011-08-26
    相关资源
    最近更新 更多