MVVM模式简介

MVVM是Model、View、ViewModel的简写,这种模式的引入就是使用ViewModel来降低View和Model的耦合,说是降低View和Model的耦合。也可以说是是降低界面和逻辑的耦合,理想情况下界面和逻辑是完全分离的,单方面更改界面时不需要对逻辑代码改动,同样的逻辑代码更改时也不需要更改界面。同一个ViewModel可以使用完全不用的View进行展示,同一个View也可以使用不同的ViewModel以提供不同的操作。

1.Model

Model就是一个class,是对现实中事物的抽象,开发过程中涉及到的事物都可以抽象为Model,例如客户,客户的姓名、编号、电话、住址等属性也对应了class中的Property,客户的下订单、付款等行为对应了class中的方法。

2. View

View很好理解,就是界面。

3. ViewModel

上面说过Model抽象,那么ViewModel就是对View的抽象。显示的数据对应着ViewMode中的Property,执行的命令对应着ViewModel中的Command。

WPF中MVVM的解耦方式

在WPF的MVVM模式中,View和ViewModel之间数据和命令的关联都是通过绑定实现的,绑定后View和ViewModel并不产生直接的依赖。具体就是View中出现数据变化时会尝试修改绑定的目标。同样View执行命令时也会去寻找绑定的Command并执行。反过来,ViewModel在Property发生改变时会发个通知说“名字叫XXX的Property改变了,你们这些View中谁绑定了XXX也要跟着变啊!”,至于有没有View收到是不是做出变化也不关心。ViewModel中的Command脱离View就更简单了,因为Command在执行操作过程中操作数据时,根本不需要操作View中的数据,只需要操作ViewModel中的Property就可以了,Property的变化通过绑定就可以反映到View上。这样在测试Command时也不需要View的参与。这也是我在接触WPF初期时根本理解不了的所谓数据驱动。

这样一来ViewMode可以在完全没有View的情况下测试,View也可以在完全没有ViewModel的情况下测试(当然只是测试界面布局和动画等业务无关的内容)。

MVVM框架需要解决的问题

从图中可以看出如果要实现一套MVVM框架,需要解决的最基本的问题就是数据绑定和命令绑定。此外由于UI中会产生大量的事件,因此还需要将事件绑定到MVVM中的命令上。后面的文章将依次尝试解决这些问题。最后还是要说一下任何设计模式都是参考,都有使用场景,切忌生搬硬套。实际开发中应根据项目特点采取适配性更强的模式。

最新文章

  1. 转:ServletContext,ActionContext,ServletActionContext
  2. 浏览器判断是否安装APP
  3. 数据存储之plist、偏好设置
  4. 解决Xcode7.1插件安装的办法
  5. 了解 MVC 应用程序执行过程
  6. leetcode@ [211] Add and Search Word - Data structure design
  7. Leveraging the Power of Asynchrony in ASP.NET [转]
  8. My way to Python - Day05 - 面向对象
  9. C语言中对于结构的定义一般放在.h中还是.c中
  10. 利用moment为基础,基于DOM实现一个多个倒计时同时进行的js库方便使用
  11. SSL证书绑定成功
  12. 高仿腾讯QQ即时通讯IM项目
  13. Chapter 4 Invitations——14
  14. bzoj3033: 太鼓达人 欧拉路径
  15. SQL里执行CLR c#代码
  16. 如何修改config?
  17. Majority Element(169) && Majority Element II(229)
  18. API网关之Kong网关简介
  19. vue-自定义组件传值
  20. Makefile 和 CMakeLists.txt

热门文章

  1. 百度地图经纬度批量查找功能XGeocoding使用手册
  2. 【BZOJ2024】舞会(动态规划,容斥,高精度)
  3. Paxos Made Simple【翻译】
  4. Unhandled rejection RangeError: Maximum call stack size exceededill install loadIdealTree
  5. 解题:HDU 4609 Three Idiots
  6. Python 爬虫入门(一)
  7. [poj 1533]最长上升子序列nlogn树状数组
  8. increment/decrement/dereference
  9. shell参数代表什么,如何调试shell?
  10. 安装并使用 Wowza 发布你的 RTMP 直播流