9

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

例子:

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


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

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

4

4 回答 4

8

当 View 绑定到 Model 时:

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

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

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

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

于 2012-07-03T06:20:26.913 回答
5

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

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

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

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

于 2012-06-29T14:43:34.437 回答
2

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

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

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

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

于 2012-07-02T05:35:47.863 回答
0

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

于 2013-10-04T07:16:56.877 回答