说不尽的MVVM(1) – Why MVVM
最近学的一篇课文《说不尽的狗》竟让我有了写《说不尽的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的更多相关文章
- [WPF] 使用 MVVM Toolkit 构建 MVVM 程序
1. 什么是 MVVM Toolkit 模型-视图-视图模型 (MVVM) 是用于解耦 UI 代码和非 UI 代码的 UI 体系结构设计模式. 借助 MVVM,可以在 XAML 中以声明方式定义 UI ...
- Pro mvvm读书笔记mvvm中的VM
一.构建ViewModels 设计模式的其中一个目标就是抽象构造一个给出指定类型的对象或者实现指定类型的接口的过程.需要把类给客户端,让客户端去使用,但是要隐藏类是具体的实现细节. 1.1The Ap ...
- 说不尽的MVVM(2) – MVVM初体验
知识预备 阅读本文,我假定你已经具备以下知识: C#.WPF基础知识 了解Lambda表达式和TPL 对事件驱动模型的了解 知道ICommand接口 发生了什么 某程序员接到一个需求,编写一个媒体渲染 ...
- ReactiveCocoa 和 MVVM 入门 (转)
翻译自ReactiveCocoa and MVVM, an Introduction. 文中引用的 Gist 可能无法显示.为了和谐社会, 请科学上网. MVC 任何一个正经开发过一阵子软件的人都熟悉 ...
- 【长篇高能】ReactiveCocoa 和 MVVM 入门
翻译自ReactiveCocoa and MVVM, an Introduction. 文中引用的 Gist 可能无法显示.为了和谐社会, 请科学上网. MVC 任何一个正经开发过一阵子软件的人都熟悉 ...
- 【转】伟大的RAC和MVVM入门(一)
原文:http://www.sprynthesis.com/2014/12/06/reactivecocoa-mvvm-introduction/ 翻译自ReactiveCocoa and MVV ...
- MVVM、MVC框架的认识
推荐博客: https://blog.csdn.net/jia12216/article/details/55520426 https://www.cnblogs.com/sunny_z/p/7093 ...
- MVVM框架从WPF移植到UWP遇到的问题和解决方法
MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
随机推荐
- linq 延迟执行带来的困扰
有这样一个案例: var filteredResult = from f in orgFileList select f; ; i < WorkStatusFilters.ListWorkSta ...
- 在eclipse中运行perl代码,需要配置的插件以及方法
Eclipse配置正则表达式 网址:http://www.cnblogs.com/itech/archive/2010/02/23/1671676.html perl的环境配置以及在Eclipse中安 ...
- 【BootStrap】 基础
[BootStrap] 基础 一. 自适应(针对不同设备如手机平板笔电,使页面的宽度适应设备宽度) <meta name="viewport" content="w ...
- A configuration with this name already exists
进入eclipse的workspace下的目录workspace\.metadata\.plugins\org.eclipse.debug.core\.launches,如实际目录为: D:\work ...
- ArcGIS Wpf MarkerSymbol 图形符号无法序列化为 JSON
[问题贴,尚不知如何解决] 在GraphicsLayer中添加一个点,使用自定义模板渲染该点,在Vs2012设计界面可以看到,但运行时出现异常 代码如下: <esri:Graphic x:Nam ...
- Selenium2+python自动化1-环境搭建
前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium2为基础,目前selenium3坑比较多,暂 ...
- Oracle 10g -- 修改DB的编码
修改DB的原因是:因为我的DB不支持中文,所以每当我向数据库表中插入一条数据的时候,中文就都变了类似于“?(是反问号)”的乱码,为了能顺利插入成功,故做了此次修改; 系统:windows XP 英文版 ...
- DIV半透明,内层不受影响的代码
<div style=" background:rgba(0, 0, 0, 0.1)"><br /> <img src="http://im ...
- Strict Standards: Only variables should be passed by reference
<?php $tag="1 2 3 4 5 6 7"; $tag_sel = array_shift(explode(' ', $tag)); print_r($tag_se ...
- Odoo10 变化
官方在 https://www.odoo.com/forum/help-1/question/fyi-what-has-odoo-r-d-been-working-on-lately-106945 发 ...