最近学的一篇课文《说不尽的狗》竟让我有了写《说不尽的MVVM》这一想法,事非亵渎,实出无奈。我在刚学WPF不久时听说有MVVM这种东西,做了下尝试,发现他能给程序的设计带来很大的好处。好东西当然要分享给大家,下面,我们就来认识下MVVM。

预备知识

阅读本文,我假定你具备以下知识:

  • C# 基础知识
  • XAML基础知识
  • 对事件驱动模型的了解
  • 听说过MVC、MVP、单元测试

MVVM是什么,好吃吗?

MVVM全称为Model-View- View Model,是软件工程中的一种软件设计模式,相信很多朋友都知道 MVC (Model-View-Controller) 和 MVP (Model-View-Presenter) 。为了使软件在健壮性、代码重用和结构方面更上一个层次,人们相继提出了MVC和MVP,MVP主要用在WinForm和WebForm里面,实现UI、数据和业务业务逻辑的分离。MVVM的目标和思想MVP类似,但MVVM建立在WPF、Windows Phone、WinRT等基于XAML的表现层技术之上,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。

至于好不好吃,试过才知道:D

给我一个用MVVM的理由

传统的事件驱动模型(前)和MVVM模式(后)

这两张图是传统开发模式和MVVM模式的逻辑处理简化图,上面说到MVVM灵活和高效,主要体现在以下几方面

数据驱动UI

事件驱动的程序设计模型在传统的WinForm开发模式中最常见不过了,包括WPF也支持这种模式。在这种模式中,程序的主角是UI,通过UI控件事件的触发对数据进行处理,然后更新UI。整个过程中,UI处于主导地位,数据处于被动状态,在事件处理代码执行完成后,数据被转化成了UI控件的状态。

在MVVM中,数据和逻辑处于一个独立的View Model中,由View Model中的逻辑对数据进行处理,数据处于主动地位, UI的任务是关注数据的更改并将它显示出来,数据不再属于UI,真正成为程序的主角。

更低的耦合度

从上面两张图可以看到,在传统的事件驱动模式中,更新UI时不可避免的要引用UI上的对象,如果要从UI上获取输入,还需要访问UI对象的属性,这样的逻辑是离不开UI的,一旦UI发生改变,即使后台逻辑不变(比如将输入用的TextBox换成Slider),后台代码就要变,痛苦可想而知。

MVVM模式中,数据是独立于UI的,数据与UI的耦合是松散的,View Model把数据以属性的形式暴露出来。UI要做的事情,就是把数据"送过来",把数据"拿回去"。

更新UI不抓狂

在传统的开发模式中,在工作线程中更新UI是一件非常麻烦的事情,这也是UI驱动数据带来的负面影响之一,在MVVM中,我们可以在工作线程中直接修改View Model的数据(只要数据是线程安全的),剩下的数据绑定帮你搞定。

更高效的团队协作

MVVM的分工是非常明显的,View Model 负责提供数据,View负责展现数据,由于View和View Model之间是松散耦合的,完全可以让程序员一边写View Model,设计师一边用Blend设计View,同时工作,效率更高。

更好的复用性

上面说到View Model独立于UI,不妨把UI理解成数据的衣服,衣服可以换,UI当然可以换,我们可以把同一个View Model用到多个View中,比如桌面版的程序和Win8 App甚至是 Windows Phone共用一个View Model。

更好的可测试性

既然View Model里面是数据和业务逻辑,因此,不用等到UI写好,我们已经可以用单元测试去检测业务逻辑的正确性了。

需要准备什么

.NET Framework 4.5

Visual Studio

MVVM light toolkit

Windows 8 / Silverlight / Windows Phone 的SDK任选一个

说不尽的MVVM(1) – Why MVVM的更多相关文章

  1. [WPF] 使用 MVVM Toolkit 构建 MVVM 程序

    1. 什么是 MVVM Toolkit 模型-视图-视图模型 (MVVM) 是用于解耦 UI 代码和非 UI 代码的 UI 体系结构设计模式. 借助 MVVM,可以在 XAML 中以声明方式定义 UI ...

  2. Pro mvvm读书笔记mvvm中的VM

    一.构建ViewModels 设计模式的其中一个目标就是抽象构造一个给出指定类型的对象或者实现指定类型的接口的过程.需要把类给客户端,让客户端去使用,但是要隐藏类是具体的实现细节. 1.1The Ap ...

  3. 说不尽的MVVM(2) – MVVM初体验

    知识预备 阅读本文,我假定你已经具备以下知识: C#.WPF基础知识 了解Lambda表达式和TPL 对事件驱动模型的了解 知道ICommand接口 发生了什么 某程序员接到一个需求,编写一个媒体渲染 ...

  4. ReactiveCocoa 和 MVVM 入门 (转)

    翻译自ReactiveCocoa and MVVM, an Introduction. 文中引用的 Gist 可能无法显示.为了和谐社会, 请科学上网. MVC 任何一个正经开发过一阵子软件的人都熟悉 ...

  5. 【长篇高能】ReactiveCocoa 和 MVVM 入门

    翻译自ReactiveCocoa and MVVM, an Introduction. 文中引用的 Gist 可能无法显示.为了和谐社会, 请科学上网. MVC 任何一个正经开发过一阵子软件的人都熟悉 ...

  6. 【转】伟大的RAC和MVVM入门(一)

    原文:http://www.sprynthesis.com/2014/12/06/reactivecocoa-mvvm-introduction/   翻译自ReactiveCocoa and MVV ...

  7. MVVM、MVC框架的认识

    推荐博客: https://blog.csdn.net/jia12216/article/details/55520426 https://www.cnblogs.com/sunny_z/p/7093 ...

  8. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  9. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

随机推荐

  1. CIDR-Address介绍

    CIDR是一种用二进制表示法来代替十进制表示法的新方法. IP地址有“类”的概念,/8掩码是A类,/16掩码是B类,/24掩码是C类等等.但是/12,/18,/25呢?这就是无类的概念了,CIDR的作 ...

  2. DDK Build的DIRS和SOURCE文件

    DDK Build编译的时候,使用3个文件来描述被编译的源码,其中SOURCES和Makefile是必须的,而DIRS则只在划分目录的时候有用.Makefile在这里作用并不大但是必须和SOURCES ...

  3. 【MVC】 js,css 压缩

    [MVC] js,css 压缩 一. 引用 System.Web.Optimization.dll : 使用 Nuget ,在控制台输入 Install-Package Microsoft.AspNe ...

  4. Oracle基础知识笔记

    1.打开oracle相关服务 2.创建Oracle用户 create user 用户名 identified by 密码;(需要dba角色创建) 3.权限管理 (1)添加权限 grant  权限.角色 ...

  5. Hibernate 根据实体名称得到DB表名以及表对应的Sequence name

    DB: oracle 10g; entityName:com.signaldemand.flank.hibernate.model.实体名 1. 根据实体名获取DB表相对应的表名 Class<? ...

  6. 小甲鱼python视频第七讲(课后习题)

    1.assert的作用. assert用来判断语句的真假,如果为假的话将触发AssertionError错误. 如果为真则继续执行. 2.变量互换(注意顺序) 3.成员资格运算符(in) 4.分数的划 ...

  7. canvas像素操作

    像素操作 相关方法:getImageData(x,y,w,h);  putImageData(oImg,x,y);  createImageData(w,h); 1.getImageData(x,y, ...

  8. 教你理解Fragment

    定义 Fragment 表示 Activity 中的行为或用户界面部分.我们可以将多个片段组合在一个 Activity 中来构建多窗口UI,以及在多个 Activity 中重复使用某个片段.可以将片段 ...

  9. IE下Debug BHO

    主要就是修改注册表键值使IE不创建多个进程:HKLM\Software\Microsoft\Internet Explorer\Main - TabProcGrowth 但需要注意的是这种情况下,vs ...

  10. (Python)集合、集合的函数

    本节我们将学习python的另一种数据类型:集合(set) 1.集合(set) 集合在Python中是一种没有重复元素,且无序的数据类型,且不能通过索引来引用集合中的元素 >>> b ...