最近学的一篇课文《说不尽的狗》竟让我有了写《说不尽的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. linux-curl restful接口测试结果格式化

    最近在做restful api, 因为服务器不能直接访问, 所以测试只能通过ScureCRT 在一台linux 上curl. 但是返回结果很多的时候, 发现:草, 这个数据怎么都是乱码? 一大堆数据, ...

  2. mybatis(三)懒加载

    懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为 ...

  3. 前端---HTML

    HTML基础 本章内容: 简介 HTML定义 标签定义和属性 HTML5基本结构 HTML5字符集 <head>标签 <title> <base/> <lin ...

  4. search--搜索引擎的使用笔记

    重度使用 完全匹配搜索 “”把搜索词放在双引号中 搜索不包含该词 减号- 常用的通配符 星号* 站内搜索site docker site:http://blog.daocloud.io/ 扩大范围搜索 ...

  5. 第六周PSP

    [week6]psp  工作周期:10.20-10.27  本周PSP     C类型 C内容 S开始时间 ST结束时间 I中断时间 T净时间(分) 活动 开事后诸葛亮会议 13:00 14:00 0 ...

  6. 如何在spark中读写cassandra数据 ---- 分布式计算框架spark学习之六

    由于预处理的数据都存储在cassandra里面,所以想要用spark进行数据分析的话,需要读取cassandra数据,并把分析结果也一并存回到cassandra:因此需要研究一下spark如何读写ca ...

  7. python在不同层级目录import模块的方法

    使用python进行程序编写时,经常会使用第三方模块包.这种包我们可以通过python setup install 进行安装后,通过import XXX或from XXX import yyy 进行导 ...

  8. 结合Apache和Tomcat实现集群和负载均衡

    http://fableking.iteye.com/blog/360870 TomcatApacheJSP应用服务器Web  本文基本参考自 轻松实现Apache,Tomcat集群和负载均衡,经由实 ...

  9. 判断是苹果还是安卓app联调

    //app苹果联调 function iosReload(){ //window.webkit.messageHandlers.signUpSuccess.postMessage(null); } / ...

  10. 纵表、横表互转的SQL

    纵表.横表互转的SQL By:大志若愚 1.建表: 纵表结构 Table_A  create table Table_A ( 姓名 ), 课程 ), 成绩 int ) ) ) ) ) ) 姓名 课程 ...