MVVM标准化

时间:2010-02-07 16:43:49

标签: mvvm

Silverlight posted中有人认为MVVM目前缺乏标准化,所以每个人都有自己的风味..

这就是为什么我和WPF门徒的一些人正在积极讨论每个人都同意的MVVM的哪些元素。我完全理解我们已经以不同的方式实现了模式,我们根据项目的需要混合了几个模式或创建了自己的模式,或者让开发人员的生活变得更轻松......但是忘记了这些困难或项目的特殊需求。让我们讨论一下每个人都同意的MVVM模式的标准规则。我也发布了some of my thoughts here

为何选择MVVM?

  • Testabiltiy(ViewModel比代码隐藏或事件驱动代码更容易进行单元测试)
  • 明确UX设计人员与开发人员之间的分离
  • 增加视图的“可混合性”
  • 永远不需要更改模型以支持对视图的更改
  • 很少需要更改ViewModel以支持对视图的更改
  • 没有重复的代码来更新视图

不在视图中

  • 不应该包含任何你想要测试的逻辑:正如Glenn所说MVVM不是代码计算练习,我们可以在代码隐藏中编写代码。但是你永远不应该写任何你想要测试的逻辑。例如:如果用户选择国家/地区,则您希望在视图中显示州或城市列表。这是业务需求,因此您应该使用单元测试来测试此逻辑。所以,你不应该在代码隐藏中写它。
  • 可以是控件或数据模板
  • 让视图尽可能简单。 :我们仍然可以谨慎使用XAML中的数据触发器或值转换器或Visual State或Blend Behivor。
  • 如果某些内容不可绑定,请使用附加属性:

在ViewModel中执行和不执行

  • 视图和模型之间的连接器
  • 保持视图状态,值转换(您可以创建要在ViewModel中显示的数据结构,而不是使用ValueConverter。例如:您需要显示名称而不是名字和姓氏。您的模型可以拥有第一个名称和姓氏,但您可以在ViewModel中创建名称属性。)
  • View
  • 没有强或弱(通过接口)引用
  • 使VM尽可能可测试(例如,不调用Singleton类)
  • VM中没有与控制相关的内容(因为如果要更改视图,则还必须更改VM。)

模型

  • 可以是数据模型,DTO,POCO,域类的自动生成代理和基于域服务和表示层分离方式的UI模型
  • 不参考ViewModel

你对此有任何建议或评论吗?

我们小组中有一个分歧。有人说在ViewModel中有View的界面是可以的。但是有人说如果View Model有View接口,那么它将是MVP模式。

我们的一位MVVM专家谈到了MVVM Vs MVP

查看=> ViewModel

  • MVVM视图直接绑定到ViewModel并通过数据绑定与VM通信
  • 在MVP中,视图绑定到悬挂在SupervisingController上的模型或者根本没有绑定(被动视图)。

ViewModel =>图

MVVM

  1. INPC / Property binding
  2. 活动
  3. 消息(Event Aggregator / Messenger / RX框架)
  4. 通过服务等中介
  5. 通过界面
  6. 通过委托(View将代理传递给VM,它可以用来调用它。例如,VM可能会公开一个SetActions方法,View调用该方法传递它委托。
  7. MVP

    在MVP案例中,标准是Presenter通过接口,数据绑定或在被动视图的情况下通过属性与视图对话。使用被动视图时,属性不使用数据绑定,而是使用视图属性getter和setter来直接设置控件值。

    您如何看待这个想法?

    你认为ViewModel有View的界面吗?

    如果您想添加更多内容,欢迎您添加...:)

    关于这篇文章的全部想法是对社区中的MVVM模式有相同的理解。

2 个答案:

答案 0 :(得分:2)

我喜欢你写的东西。真正让我感到困惑的一件事是,很多人似乎都将他们的VM与他们的视图非常紧密地联系在一起 - 如果你这样做,那么你可能只是做旧的 XAML +一切都被打入了之后的代码。

我使用的模式是MVVM上的一个小变体(但它大致相同)。就个人而言,我喜欢将ViewModel作为接口提供给View - 它使分离非常干净。这在做原型时有很多好处,视觉元素可以在视图中切换或切换出来,对ViewModel影响很小或没有影响。

答案 1 :(得分:0)

我认为View ViewModel通过数据绑定之间的通信使MVVM成为自己的模式而不是其他关注点分离。对于vm来说,通过接口了解视图是否为GOOD或BAD并非如此,但在传达正在使用的模式的上下文中,它不是MVVM。

遗憾的是,获得和维护标准的一些困难在于WPF和Silverlight的缺点和复杂性。但是,当有多个有效标准时,我会戴上我的Martin Fowler帽子并添加“何时使用它”部分。

您的标准是否涵盖了本地化等跨领域问题?

FWIW我喜欢你写的内容,很高兴你在这里发布了......

干杯,
Berryl