MVVM在ViewModel中复制模型属性

时间:2012-06-29 13:44:01

标签: mvvm

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

示例:

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


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

为什么需要这个?我可以理解,如果Model没有实现INPC,但如果确实如此,那么我觉得这很不必要。

4 个答案:

答案 0 :(得分:8)

当视图绑定到模型时:

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

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

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

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

答案 1 :(得分:3)

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

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

否则我绑定到Model(它是ViewModel上的公共属性)。如果我的情况发生了变化,我需要封装一些东西,那么当我需要时我会重构。

我总是尽力确保有一个ViewModel(即使它只暴露模型),所以稍后重构会更容易。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

您的ViewModel不正确。 如果您已经拥有Model of Product类型,则只需在ViewModel中定义类似的内容: 公共产品{...}