MVVM模式能够帮你把你程序的业务与展现逻辑从用户界面干净地分离开。保持程序逻辑与界面分离能够帮助解决很多开发以及设计问题,能够使你的程序能更容易的测试,维护与升级。它也能很大程度的增加代码重用性,并让开发者与界面设计者更容易地相互合作。

使用MVVM模式,程序的UI和其背后的展现与业务逻辑将被分离至三个类中:

1-视图,封装UI与UI逻辑

2-模型视图,封装展示逻辑与状态

3-模型,封装程序的业务逻辑以及数据

MVVM模式是展示-模型模式的变种,它优化了一些WPF的核心特性,例如数据绑定,数据模版,命令以及行为。在MVVM模式中,视图通过数据绑定以及命令行与视图模型交互,并改变事件通知。视图模型查询观察并协调模型更新,转换,校验以及聚合数据,从而在视图显示。

下图展示了MVVM类以及它们之间的交互:

视图类

视图的责任便是定义用户在屏幕上能看到的一切的结构以及外观。理想的视图背后的代码只包含调用InitializeComponent方法的构造函数。视图通常扮演以下关键角色:

  • 视图是可视化元素,例如窗口,页面,用户控件或者数据模版
  • 视图定义了包含在视图里的控件以及可视化层以及样式
  • 视图通过DataContext属性应用视图模型
  • 绑定了控件以及数据的属性以及命令被视图模型暴露出来
  • 视图可以定制化视图与视图模型间数据绑定行为
  • 视图定义以及处理UI可视化行为例如动画
  • 视图背后的代码实现了用XAML很难表达的可视化行为

视图模型类

视图模型在MVVM模式中为视图封装了展示逻辑,它并不是直接引用视图或者任何其他关于视图特定的实现或者类型。视图模型实现了属性以及命令使得视图进行数据绑定,并通过改变事件通知来提醒视图状态已经改变了。视图模型提供的属性和命令定义了提供给UI的功能。但是视图定义了如何渲染的功能。

视图模型负责协调视图与任何需要的模型类的交互。很典型的,视图模型与视图类有着一堆多的关系。视图模型可以选择直接将模型类暴露给视图,因此视图的控件能够直击进行数据绑定。视图模型可以转换或者操纵模型数据所以能够很容易被视图使用。

很典型的,视图模型会定义能被展现在UI上并被用户调用的的命令或者行为。一个通用的例子就是当视图模型需要提交命令时会允许用户提交数据到网络服务或者数据库。视图可以选择用一个按钮来展示所以用户能够点击该按钮提交数据。典型地,当命令编程不可用的,它相关的UI展示也变得不可用。视图模型通常扮演下面这些关键角色:

  • 模型视图是非可视化类,它封装了展现逻辑
  • 视图模型是可以独立于视图与模型调试的
  • 视图模型很典型地是不直接引用视图的
  • 视图模型实现了视图用来数据绑定的属性与命令
  • 视图模型通过改变提醒事件通知视图状态的改变:INotifyPropertyChanged与INotifyCollectionChanged
  • 视图模型协调视图与模型的交互
  • 视图模型可以定义视图展现给用户的逻辑状态

模型类

model在MVVM模式中封装了业务逻辑以及数据,业务逻辑定义了像所有检索和程序数据管理相关的程序逻辑一样,用来确保所有的保证数据持久与有效的业务规则被应用。最大化代码重用,模型不能包含任何特定的情况,特定的用户任务以及程序逻辑。

典型的有模型为程序展现了客户端域模型,模型也可能包含支持数据访问与缓存的代码,即使有一个分离的数据库或者服务被使用。模型与数据房分层通常被作为数据访问或呜呜结构而生成,例如ADO.NET尸体矿井唉,WCF数据服务,或者WCF RIA服务。

模型层实现了轻松绑定视图的功能。这通常意味着它支持通过INotifyPropertyChanged INotifyCollectionChanged 进行属性与集合更改通告。展现对象集合的模型类典型地源自ObservableCollection<T>类,该类提供了对INotifyCollectionChanged接口的实现。

模型也能通过IDataErrorInfo接口支持数据验证以及错误报告。这些接口允许当数值改变时的WPF数据绑定被通知,从而更新界面。模型通常扮演如下的关键角色:

  • 模型类是不可视类,它封装了程序数据
  • 模型类不直接应用视图或视图模型类
  • 模型类不依赖于它们是如何实现的
  • 模型类是典型地通过INotifyPropertyChanged/INotifyCollectionChanged接口提供属性与集合更改事件的.
  • 模型类很典型地继承自ObservableCollection<T>
  • 模型类是很典型地通过IDataErrorInfo/INotifyDataErrorInfo.提供数据验证与错误报告
  • 模型类典型地与封装了数据访问的服务一起使用

MVVM设计模式《网摘》的更多相关文章

  1. WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书

    原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...

  2. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  3. 浅谈 MVVM 设计模式在 Unity3D 中的设计与实施

    初识 MVVM 谈起 MVVM 设计模式,可能第一映像你会想到 WPF/Sliverlight,他们提供了的数据绑定(Data Binding),命令(Command)等功能,这让 MVVM 模式得到 ...

  4. Feedly订阅Blog部落格RSS网摘 - Blog透视镜

    网络信息爆炸的时代,如何更有效率地阅读文章,订阅RSS网摘,可以快速地浏览文章标题,当对某些文章有兴趣时,才点下连结连到原网站,阅读更详细的文章,Feedly Reader阅读器除了提供在线版订阅RS ...

  5. Bloglines订阅Blog部落格RSS网摘 - Blog透视镜

    网络信息蓬勃发展,Blog部落格越来越普及,如果逐一地去浏览网站,势必费时费力,倘若信息可以自己送上门,那就可以节省不少时间,就好像看报纸的标题,有兴趣才点连结,进到网站浏览文章内容,Blogline ...

  6. 设计模式笔记之三:Android DataBinding库(MVVM设计模式)

    本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236908&idx=1&sn=9e53 ...

  7. TCP/IP协议头部结构体(网摘小结)(转)

    源:TCP/IP协议头部结构体(网摘小结) TCP/IP协议头部结构体(转) 网络协议结构体定义 // i386 is little_endian. #ifndef LITTLE_ENDIAN #de ...

  8. Vim命令快捷键(网摘)

    Vim命令快捷键(网摘) 原文出处:[?---->home]

  9. c#与C++类型转换网摘

    转载自 C++和C#转换 https://www.cnblogs.com/zjoch/p/4147182.html c#与C++类型转换,网摘 //c++:HANDLE(void   *)       ...

  10. Delphi 中DataSnap技术网摘

    Delphi2010中DataSnap技术网摘 一.为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7 ...

随机推荐

  1. 发现一个很好的android开发笔记库

    http://linux.linuxidc.com/ 密码和用户名都是www.linuxidc.com android基础教程到高手进阶,游戏开发,数据存储,android架构等.谢谢网站主分享!

  2. 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> ...

  3. 前端MVC学习——模块发开发、seajs学习

    这份学习链接已经足够了:http://seajs.org/docs/#intro 我假设你至少已经浏览过上述链接文档.并且掌握了基本的seajs基础知识~ 手把手教你创建helloworld~ Hel ...

  4. ASP.NET MVC 中CSS JS压缩合并 功能的使用方法

    通过压缩合并js文件和css文件,可以减少 服务器的响应 次数和 流量,可以大大减小服务器的压力,对网站优化有比较明显的帮助!压缩合并 css 文件和js文件是网站优化的一个 比较常用的方法. ASP ...

  5. uva 307

    排序之后再剪枝,有点神 #include <cstdio> #include <cstdlib> #include <cmath> #include <map ...

  6. D&F学数据结构系列——红黑树

    红黑树 定义:一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树: 1)每个结点不是红的就是黑的 2)根结点是黑的 3)每个叶结点是黑的 4)如果一个结点是红的,它的两个儿子都是黑的(即不可能有两个 ...

  7. who is in front of me 解题报告

    题目描述:N(1<=N<=50005)个学生站成一个纵队,每个人只能看到前面身高比他高(严格大于)的人 求所有人中能看到的最大人数 分析:对于某个人A,设前面第一个身高比他高的人是B.如果 ...

  8. java基础知识回顾之---java StringBuffer,Stringbuilder与String的区别

    public class StringBuilderTest { /** * StringBuffer和Stringbuilder :使用与内容可以被修改的字符串 * 与String的区别:Strin ...

  9. POJ 2407 Relatives(欧拉函数)

    题目链接 题意 : 求小于等于n中与n互质的数的个数. 思路 : 看数学的时候有一部分是将欧拉函数的,虽然我没怎么看懂,但是模板我记得了,所以直接套了一下模板. 这里是欧拉函数的简介. #includ ...

  10. hdu1102

    http://acm.hdu.edu.cn/showproblem.php?pid=1102 最小生成树(模板题) 3 0 990 692 990 0 179 692 179 0 1 1 2 一共3个 ...