似乎有一个指导,模型不应该将其实体暴露给View,并且所有必需的属性都应该在ViewModel中重复
示例:
Product
Id {get; set;}
Name {get; set;}
.......
ProductViewModel : ViewModelBase
Id {get; set;}
Name {get; set;}
.......
为什么需要这个?我可以理解,如果Model没有实现INPC,但如果确实如此,那么我觉得这很不必要。
答案 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中定义类似的内容: 公共产品{...}