MVVM Light是Silverlight开发中比较流行的MVVM框架。本文作者将根据一个实际项目(Windows Phone程序),为大家介绍MVVM Light的使用说明。
MVVM Light相关资源
项目地址:http://mvvmlight.codeplex.com/releases
MVVM Light介绍
首先贴一张图,这是MVVM的一个内部通信机制。
简单的概括来说MVVM Light帮我实现了View和ViewModel的相互通信,ViewModel和Model的通信。
为什么使用MVVM Light
◆比较方便做单元测试;
◆不需要改变Model来支持不同的View变化;
◆在View发生变化时,只需要对ViewModel做极小的改变就可以适应新的程序,很方便程序的移植;
◆将设计UE和开发分离,开发人员只负责底层通信的实现,做界面的人员只需尽可能的去美化UI,我们团队中将ViewModel也是交给界面设计人员来做,我觉得ViewModel究竟由UE还是由开发来做还是值得商榷的,因该根据具体团队分工来说。
MVVM Light使用
如果你打开我上面说的链接地址的话,你会安装MVVM Light的.msi文件,安装成功后,打开VS2010,选择新建项目,会看到如下界面:
新建好一个MVVM项目,你会在右边看到一个如下的项目树,他们中分别有对应我们需要使用的View,ViewModel,Model,我个人习惯一个View对应一个ViewModel,当然如果Model有复用的情况,就可以多个ViewModel对应一个Model,所以Model的数量是根据个人情况可以改变的,有的人还习惯将Model放入ViewModel中,但是既然MVVM Light已经给我们将文件树的框架列出来了,我想也有他的道理。
再说说那个ViewModelLocator文件,他是整个项目的核心文件,打个比方来说就好比人脊梁,支撑着我们的四肢。在他当中我们对每一个ViewModel进做了实例化,而在他的构造函数中使用了一个Singleton设计模式,从而保证,在整个项目运行过程中,只存在一个ViewModelLocator实例,不过我发现这个Singleton并没有对多线程做支持,也就是说如果你做的是多线程程序,这里需要改成支持多线程的Singleton,具体我在之前的博文中有介绍Singleton。
介绍完了各个文件的作用,就来说说具体用法,在这里我不想一步一步写出来每一行代码的用法,因为感觉浪费时间,而且有些重复很多网友的劳动,我只将一些比较关键的代码贴出来,希望对你起到触类旁通的作用。
首先打开App.xaml文件,你会看到如下代码,如果没有请自己添上,因为App文件是一个全局变量,并且在程序最开始启动就已经运行了,这里的代码是告诉编译器在程序一开始就去访问ViewModelLocator文件,并且构造一个全局可以访问的ViewModelLocator实例,x:key是用于xaml文件访问的,d:IsDataSource是用于ExpressionBlend构建界面时来实时显示数据用的。
既然有了全局的ViewModelLocator,那么就可以在View中去构建Command与ViewModel中的Command进行绑定,从而实现View和ViewModel的通信,下面是在View当中两种调用Command的方式:
上面两个调用方式效果是完全一样的,我怀疑上面那种方式是下面的一种封装,因为cmd是可以用在Button类控件当中的,而下面的则不行,当然除了简简单单的绑定Command外,也可以传递CommandParameter参数,而且还有支持手势的Command,因为本文并没有想去讨论的这么深入,所以就不多深入介绍,如果你有兴趣,可以通过右侧微博或是在博客里留言等方式找到我。
下面是在ViewModel中去实现上面所要用到的Command。
除了Command外,相信MVVMLight给我带来的就是Messager这个东西了,他一般被使用在code-behind当中,使用方式如下:
在ViewModel中响应该Messenger的代码在之前介绍ViewModel的Command中已经有出现,可以看看那里注释掉的代码,在这里需要注意的是在OnNavigationTo方法注册了Messenger之后在OnNavigationFrom中一定要进行卸载,否则会造成内存泄漏。
原文链接:http://tmango.com/?p=878