MVVM设计模式

2010-09-19 23:59:18|  分类: MVVM |  标签:mvvm  silverlight4  mvc  mvp  command  |举报|字号 订阅

 
 

一、背景:与用户界面 (UI) 相关的最大的问题就是大量的凌乱的代码,原因两个:

(1)  用户界面包含负责的逻辑用于维护界面相关对象;

(2)      其次也包含了应用程序状态的维护。

用户界面的3大问题:状态 (State) , 逻辑 (Logic) ,同步 (Synchronization),其中状态是用户界面最关心的问题之一。

二、简述MVC、MVP、MVVM

(1)     MVC:模型-视图-控制器(Model View Controller),它强制性的使应用程序的输入、处理和输出分开。

(2)    MVP:模型-视图-表现类(Model-View-Presenter)

(3)    MVVM:模型-视图-视图模型(Model-View-ViewModel)

三、比较

(1)    发展过程:MVC->MVP->MVVM

(2)    MVC->MVP

MVC中Model不是纯Model,因为它要有View的一些数据结构。

 

(3)  MVC、MVP->MVVM

View没有大量代码逻辑。结合WPF、Silverlight绑定机制,MVP演变出了MVVM,充分利用了WPF、Silverlight的优势,将大量代码逻辑、状态转到ViewModel,可以说MVVM是专门为WPF、Silverlight打造的。

(4)用户界面问题比较

MVC

MVP

MVVM

V

C

V

P

V

VM

状态

逻辑

同步

四、MVVM

(1) 组成部分Model、View、ViewModel

(a)  View:UI界面

(b) ViewModel:它是View的抽象,负责View与Model之间信息转换,将View的Command传送到Model;

(c)     Model:数据访问层

(2)  View与ViewModule连接:

(a)     Binding Data:实现数据的传递

(b)      Command:实现操作的调用

(c)      AttachBehavior:实现控件加载过程中的操作

Binding和Command可以写在XAML中。

(3)  优势

(a)     ViewModule易于单元测试;

(b)     View没有MVC、MVP复杂的代码逻辑,让整个开发过程中的UI设计和后台的代码编写完全分开,设计者可以专注于使用Express Blend等去设计页面也就是View,而开发的可以完全通过Model来定义要操作的object,通过ViewModel来定义出来需要对这些model做哪些操作,最后使用Command来把Model和View完全联系到一起。

(4)    不足

(a)     编写Command的任务重;

(b)     由于Silverlight不能引用非Silverlight项目,许多界面层的逻辑也得放到后台(非ViewModel部分),如Command实现,必须通过WCF通信调用服务。

(5)    ICommand

(a)    编写每一个需要绑定的Command

(b)     网上有写好的基于WPF的Command模板,利用Prism特性重用这部分。

(c)     直接利用Prism的DelegateCommand和CompositeCommand类

DelegateCommand接受Delegate参数

CompositeCommand可以将多个Command组合在一起。

注:Prism 是微软最佳实践,可以简化建设WPF和Silverlight应用。

(6)     Command原理

(7)AttachBehavior

(a) 背景

假设我们有一个Button, 当该Button被点击的时候我们要完成一些操作, 很简单, 将该操作封装成一个Command并绑定到该Button上就可以了, 但如果我们要在Button被Load的时候执行另外一些操作呢?  由于Button没有直接被Load事件所触发的Command, 所以不能使用Command了. 不能直接将Load事件处理器写在Button所在的xaml所对应的CS文件里, 这和我们刚才对MVVM的设计是相矛盾的. 一个不太好的方案是继承一下Button, 并撰写一个由Load所触发的Command, 这可行, 但明显不好. 正如一个控件没有某个属性并且在不继承的情况下而采用AttachProperty一样, 我们可以采用AttachBehavior.

五、MVVM具体应用

(1)     Command工作流程:

主要使用Prism的DelegeCommand、CompositeCommand类与订阅、发布原理。

(a)       ViewModel初始化命令(ICommand)

public DelegateCommand<object> AddAdministorCommand { get; private set; }

this.AddAdministorCommand = new DelegateCommand<object>(this.AddAdministor);

(b)     View UI元素绑定ViewModel Command属性

Command="{Binding Path=AddAdministorCommand}"

(c)     在ViewModel中定义一个事件(event),实现CompositePresentationEvent<object>接口(object-传递参数)。

public class AdministorRequestEvent: CompositePresentationEvent<AdministorViewModel>

{ }

(d)     使用TheAggregator订阅一个事件的执行者(Action)

this.TheAggregator.GetEvent<AdministorRequestEvent>().Subscribe(ShowAdministorVie        w);

public void ShowAdministorView(AdministorViewModel administorVM)

{

AdministorView administorV = new AdministorView();

administorV.ViewDataContext = administorVM;

administorV.Show();

}

(e)    使用发布一个事件

private void AddAdministor(object obj)

{

this.TheAggregator.GetEvent<AdministorRequestEvent>().Publish( new AdministorViewModel(Administor.CreateNewAdministor(),_administorRepository));

}

MVVM3的更多相关文章

随机推荐

  1. sql语句(mysql中json_contains、json_array的使用)

    https://blog.csdn.net/qq_35952946/article/details/79131488 https://www.jianshu.com/p/455d3d4922e1 1. ...

  2. element-UI中el-select下拉框可搜索时候,filter-method自定义搜索方法

    使用element-UI框架的使用,我们经常使用el-select下拉框,很多时候还需要使用可搜索的下拉框,然后elementUI官网的实例中只是提了一下filter-method可以自定义搜索方法, ...

  3. Tomcat WEB站点部署

    上线的代码有两种方式, 第一种方式是直接将程序目录放在webapps目录下面 第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面.下面让我们见识一下这种方式 这个网站里面已 ...

  4. redis的ruby客户端(三)

    1. 介绍 clients这里列出了redis所支持的语言的所有客户端程序,其中就有ruby的.有这么多的客户端,说明要实现redis的客户端是不难的.其实你只要掌握一种语言的socket编程就可以实 ...

  5. TensorFlow学习笔记(二)深层神经网络

    一.深度学习与深层神经网络 深层神经网络是实现“多层非线性变换”的一种方法. 深层神经网络有两个非常重要的特性:深层和非线性. 1.1线性模型的局限性 线性模型:y =wx+b 线性模型的最大特点就是 ...

  6. HDU - 6395 Sequence (分块+快速矩阵幂)

    给定递推式: 求Fn. 分析:给出的公式可以用快速矩阵幂运算得到,但 P/n 整除对于不同的i,值是不同的. 可以根据P将3-n分成若干块,每块中P整除n的值是相同的.分块的时候要注意判断. 将每块的 ...

  7. HDFS JAVA API介绍

    注:在工程pom.xml 所在目录,cmd中运行 mvn package ,打包可能会有两个jar,名字较长的是包含所有依赖的重量级的jar,可以在linux中使用 java -cp 命令来跑.名字较 ...

  8. Python3.x:获取登录界面校验码图片

    Python3.x:获取登录界面校验码图片 实例代码: # python3 # author lizm # datetime 2018-06-01 18:00:00 # -*- coding: utf ...

  9. 插入算法分别从C,java,python三种语言进行书写

    真正学懂计算机的人(不只是“编程匠”)都对数学有相当的造诣,既能用科学家的严谨思维来求证,也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”. 作为一个初级编程人员或者说是一个 ...

  10. jQuery 3D垂直多级菜单

    在线演示 本地下载