MVVM3
一、背景:与用户界面 (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的更多相关文章
随机推荐
- FW: AMD, CMD, CommonJS和UMD
javascript 我是豆腐不是渣 4月5日发布 推荐 2 推荐 收藏 32 收藏,486 浏览 今天由于项目中引入的echarts的文件太大,requirejs经常加载超时,不得不分开来加载ech ...
- Storm-源码分析- spout (backtype.storm.spout)
1. ISpout接口 ISpout作为实现spout的核心interface, spout负责feeding message, 并且track这些message. 如果需要Spout track发出 ...
- 一篇搞定vue-router
由于Vue常见于前后端分离开发场景下,所以页面跳转工作全部交给了前端,所以基于集中管理的原则,就有了vue-router插件,它给定了url和组件之间的跳转规则 Demo准备 vue init web ...
- Web 编程中编码问题
1. 常见字符编码 iso-8859-1(不支持中文) gbk(国标码) utf-8 (万国码, 支持全世界的编码) 2. 响应编码 当使用 response.getWriter() 来向客户端发送字 ...
- Java 集合框架之 JDK 1.5 新特性
forEach 循环 多用于元素迭代. 适用范围: - 数组 - 实现 Iterable 接口的集合类 格式: for(类型 变量 : Collection 集合 | 数组) { } 传统 for 和 ...
- UTF-8具体解释
UTF-8是一种变长字节的编码方式.它以8位(1字节)为单位对Unicode进行编码. UTF-8理论上最多能够达到6字节长.但眼下全世界的字符仅仅须要4字节就能够表示完. UTF-8规定,对于某一字 ...
- 008-shiro与spring web项目整合【二】认证、授权、session管理
一.认证 1.添加凭证匹配器 添加凭证匹配器实现md5加密校验. 修改applicationContext-shiro.xml: <!-- realm --> <bean id=&q ...
- python1变量,表达式和语句
1.变量和类型 变量是指向各种类型值的名字,以后再用到某个值时,直接引用这个名字即可,不用再写具体的值,在python中,变量的使用环境非常宽松,没有明显的变量声明,而且类型不是固定的.如果你不能确定 ...
- go——字典
Go中字典类型是散列表(hash table)的一个实现,其官方称谓是map.散列表是一个实现了关联数组的数据结构,关联数组是用于表示键值对的无序集合的一种抽象数据类型.Go中称键值对为键-元素对,它 ...
- Jsoup学习总结
Jsoup学习总结 摘要 Jsoup是一款比较好的Java版HTML解析器.可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方 ...