似乎有一个指导意见,即模型不应将其实体暴露给 View,并且所有必需的属性都应在 ViewModel 中复制
例子:
Product
Id {get; set;}
Name {get; set;}
.......
ProductViewModel : ViewModelBase
Id {get; set;}
Name {get; set;}
.......
为什么需要这个?如果 Model 没有实现 INPC,我可以理解这一点,但如果它实现了,那么我觉得这完全没有必要。
似乎有一个指导意见,即模型不应将其实体暴露给 View,并且所有必需的属性都应在 ViewModel 中复制
例子:
Product
Id {get; set;}
Name {get; set;}
.......
ProductViewModel : ViewModelBase
Id {get; set;}
Name {get; set;}
.......
为什么需要这个?如果 Model 没有实现 INPC,我可以理解这一点,但如果它实现了,那么我觉得这完全没有必要。
当 View 绑定到 Model 时:
如果视图需要更改或者您有多个视图,则对模型的更改将导致绑定到该模型的所有视图发生更改。
从 View 的角度来看,它所绑定的对象可能不是那么直观;当您需要向对象添加属性和/或命令时,您是将它们添加到 ViewModel 并在模型中保留“原始”属性还是修改模型?
拥有 ViewModel 为您提供了单个模型和多个(版本)视图之间的额外抽象
总而言之,这只是一个指导方针,但请注意,当您需要修改/更新应用程序时,今天看起来还不错的东西可能不是那么好。
指导,就是这样。这取决于手头的情况。纯粹主义者会争辩说,将模型与视图完全分离允许模型在不改变视图的情况下改变。
如果必须,我倾向于只代理模型属性(INPC 或某些特定于视图的逻辑,例如模型具有 FirstName 和 LastName 但没有 FullName)
否则我绑定到模型(这是 ViewModel 上的公共属性)。如果我的情况发生变化并且我需要封装一些东西,那么我会在需要时进行重构。
我总是尝试确保有一个 ViewModel 就位(即使它只公开模型),以便以后重构更容易。
我的问题是,你的模型为什么要实现 INPC?他们需要吗?
通常模型只是一个 DTO,不需要任何更改逻辑。
此外,如果您的 INPC 的基本实现来自 MVVM 框架,但您的模型存在于共享程序集中,那么该程序集是否需要对您的 MVVM 框架以及可能的其他 WPF 程序集的引用?
我们的场景是一组共享对象,它们在服务器端和客户端都代表我们的数据。客户端是一个 WPF 应用程序,所以这很好,但服务器端是一个服务,所以我们不需要 INPC。
您的 ViewModel 不正确。如果你已经有一个产品类型的模型,你可以简单地在你的 ViewModel 中定义这样的东西: public Product Product {...}