WPF综合指导:MVVM vs MVP

我很困惑。也许你可以帮助我:)

我一直在跟踪CAG的指导,发现MVP模式非常自然。
假设我有一个UI就绪的模型(例如:实现INotifyPropertyChanged),我使用演示者将该模型绑定到视图(演示者知道视图的接口),使我的Code-Behind尽可能小的只处理Bindings(模型和命令)不具有ICommand的控件的属性(或方法)或事件,在这种情况下立即被委派给演示者。

>过了一段时间,我发现了MVVM模式,到目前为止,它不包括我。
据我所知,只有当我的模型不是UI就绪时,我才会使用MVVM。但是,保持演示者并且只使用新的模型会更合理,我不明白这种用法会丢失什么。
我知道我错过了一些东西,但是它是什么呢:)
>此外,当您的View是通用的并且可以处理多种类型的模型(如PropertyGrid中)。 ViewModel建议与DataTemplate一起使用,但在这种情况下,您无法为模型中的每个实体创建一个模板,只需要在运行时进行调查,您会推荐什么?
在观看Josh Smith在screencast中谈论MVVM时,我有一种感觉,在ViewModel中重新暴露模型是违反了DRY(不要重复你自己),这真的是不可避免的吗?令人惊讶的是,我没有人反对这个比较火焰ADO.Net Dynamic Data metadata classes are getting nowadays

希望很清楚

谢谢

阿里尔

最佳答案
关于#3,很多人会使用“另一层间接”论证,说模型的变化不会影响观点。虽然这在技术上是正确的,但不是这样做的真正原因。

如果您将模型视为您从数据访问层或服务(通常被认为是这些)获得的实体,您将开始了解为什么需要一个ViewModel。 ViewModel旨在使用View需求的行为来扩展模型。

例如。如果您想要更改属性,并通过绑定通知此更改的视图,该属性需要提高某种形式的NotifyPropertyChanged,以便视图可以做出反应。这是您典型的模式不会有的行为。

在另一个例子中,假设您有一个集合,并且当用户单击视图中该项目旁边的复选标记时,您希望以布尔值标记集合中的每个项目。你可能需要一个“IsSelected”属性。这是模型不应该提供的一种行为。

但是我看到你从哪里来…我一开始就有这个问题。我第一次将模型的内容复制并粘贴到我的视图模型中,我的胃转动了,但你只需要和平,因为对于你的视图工作,这将需要一个额外的行为,一个模型应该不提供

不管这是多么干,强制您的WCF类型或LINQ到SQL类型(或任何你最喜欢的ORM)实现INotifyProperyChanged更糟。

转载注明原文:WPF综合指导:MVVM vs MVP - 代码日志