最近学的一篇课文《说不尽的狗》竟让我有了写《说不尽的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. static 变量

    被static 修饰的变量全部称为静态变量.所有的静态变量全部存储在静态存储区.按静态变量定义的位置不同,又分为全局静态变量和局部静态变量. 1)全局静态变量 在全局变量的说明前加上static,就是 ...

  2. python json学习之路2-认识python种的json模块

    1.从python原始类型向json类型的转化过程,具体的转化对照如下: 2.从json到python的类型转化对照如下: 3.json提供四个功能:dumps, dump, loads, load ...

  3. URL Parsing

    [URL Parsing] urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True) Parse a URL into six ...

  4. poj1741 树上的点分治

    题意: 一棵10000个点的树,每条边的长不超过1000,给定一个值k,问距离不超过k的点对数有多少.(多组数据) 输入样例: 5 4 1 2 3 1 3 1 1 4 2 3 5 1 0 0输出样例: ...

  5. Light OJ 1025 - The Specials Menu(动态规划-区间dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1025 题目大意:一串字符, 通过删除其中一些字符, 能够使这串字符变成回文串. ...

  6. ELK日志管理之——logstash部署

    1.yum源配置 [root@localhost ~]# cat > /etc/yum.repos.d/logstash.repo <<EOF [logstash-1.5] name ...

  7. plupload简易应用 多图片上传显示预览以及删除

    <script> var uploader = new plupload.Uploader({ //实例化一个plupload上传对象 browse_button: 'btnBrowse' ...

  8. 对于for循环构成的九宫格里的button,如何满足“有默认选中的一个,并且只能选中一个”?

    需要构造一个全局变量self.priceBtn 在九宫格写法中 ) { self.priceBtn = btn; self.priceBtn.selected = YES; } 在button的点击方 ...

  9. poj 2551 Ones

    本题的想法很简单,就是模拟手算乘法.不一样的是,需要控制输出的结果:每一位都是由1构成的整数. 代码如下: #include <iostream> using namespace std; ...

  10. Two Sum & Add Two Numbers

    Two Sum 题目:https://leetcode.com/problems/two-sum/ class Solution(object): def twoSum(self, nums, tar ...