一、背景:与用户界面 (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));
}
总结以上是内存溢出为你收集整理的MVVM设计模式全部内容,希望文章能够帮你解决MVVM设计模式所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)