探秘Model-View-ViewModel设计模式

开发 后端
这里将简单介绍一下Model-View-ViewModel设计模式,希望通过本文能让大家对Model-View-ViewModel有所了解。
Model-View-ViewModel很多人肯定感觉不太熟悉,这里我们将介绍Model-View-ViewModel与MVC、MVP等模式的不同点,同时还要以DEMO的形式来进行开发讲解。

Model-View-ViewModel和MVC、MVP设计模式的不同点

Model-View-ViewModel设计模式是MVP设计模式与WPF技术相结合的产物,对于一些很常见的如Model-View-Controller(MVC)设计模式和Model-View-Presenter(MVP)设计模式来说,当在WPF下使用时它们都有一个很大的缺点:就是它们根本没有考虑到WPF强大的数据绑定技术。在这些模式中,Controller或者Presenter对视图的行为负责,就像填充TextBox的文本内容,加载ListBox,填充表格的内容等等。而这些在WPF中都能轻松解决,因为正好WPF最大的优点之一就是它丰富的数据绑定能力。如果在WPF中使用MVC或者MVP设计模式,就可能完全无法利用WPF中数据绑定的方便性,而Model-View-ViewModel则不一样。

Model-View-ViewModel的定义

Model-View-ViewModel设计模式最早是由John Gossman引入的,感兴趣的朋友可以看看“http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx”这篇文章。该模型提供了一个纯净的Model,创建了一个抽象的视图来容纳状态,并且数据从一个由可视化设计器创建的视图绑定到一个抽象的视图上。该可视化设计器主要是Microsoft Expression Blend工具,而这个抽象的视图则是ViewModel。关键的地方是通过数据绑定在View与ViewModel模型之间进行双向的联系。当正确地使用该设计模式后,每一个View除了纯净的XAML和非常少量的后置代码外不会再包含任何东西,彻底地做到了界面展示和业务逻辑的分离,让程序员更加专注于代码的编写。

ViewModel

ViewModel的作用是让Mdoel更加适合于View。例如你有一个返回了一个泛型集合IList的方法,但你实际上可能还会把它转换到一个对WPF更加友好的类中以更加方便地进行数据绑定。通过ViewModel,可以把IList类型的Model集合转换成如CollectionView之类的东西以方便WPF中的UI界面元素进行数据绑定,完成这项任务最关键的地方在于在ViewModel中暴露出一个公共的属性。和Controlller类似,ViewModel也能用来容纳View的状态以及执行View需要的任何命令。
因为WPF内置了Command模式,对于像Button控件之类的UI元素来说都有一个Command的属性,它是WPF所定义的ICommand类型。可以把这些命令放到ViewModel中并以公有属性的形式暴露出来,这样就可以让View对其进行绑定。这极其强大,因为它可以把ModelView中的可执行代码绑定到窗体的Button上。

Demo

以下是使用了Model-View-ViewModel 设计模式的一个简单的WPF应用程序例子,感兴趣的话可以下载代码看看。后台使用的是大家常见的Northwnd数据库:

简单的WPF应用程序例子

相关的类关系图如下:

相关的类关系图

原文标题:Model-View-ViewModel 设计模式介绍

链接:http://www.cnblogs.com/gyche/archive/2009/09/21/1557307.html

【编辑推荐】

  1. 详解ASP.NET MVC分页的实现方法
  2. ASP.NET MVC与WebForm区别谈
  3. ASP.NET MVC应用程序执行过程分析
  4. ASP.NET MVC分页控件的实现
  5. 有关ASP.NET MVC框架的一些基础知识
责任编辑:彭凡 来源: 博客园
相关推荐

2014-07-17 10:06:02

Model-View-iOS App

2021-04-27 08:31:10

前端应用场景

2013-07-31 13:13:50

Windows PhoMVVM模式

2017-07-20 11:18:22

Vue.jsMVVMMVC

2021-02-01 10:01:58

设计模式 Java单例模式

2024-11-29 08:26:37

2010-04-09 09:28:37

View Model

2023-11-02 21:11:11

JavaScript设计模式

2014-08-21 09:31:06

路由

2023-05-04 08:47:31

命令模式抽象接口

2022-01-12 13:33:25

工厂模式设计

2020-08-21 07:23:50

工厂模式设计

2013-11-26 16:09:34

Android设计模式

2020-11-03 13:05:18

命令模式

2023-04-10 09:20:13

设计模式访客模式

2020-10-23 09:40:26

设计模式

2020-11-04 08:54:54

状态模式

2017-03-02 11:10:39

AndroidMVVM应用程序

2021-04-19 21:25:48

设计模式到元

2012-07-10 02:01:53

设计模式命令模式
点赞
收藏

51CTO技术栈公众号