欢迎阅读个人MVVMLight教程系列文章《关于 MVVMLight 设计模式系列》html
在文章的其实咱们就说了,MVVMLight的精华就是消息通知机制,设计的很是不错。这个东西在MVVMLight能够说是用的及其的频繁,当 ViewModel请求View要有些改变的时候(好比弹个窗体)那么你在ViewModel里面编写弹窗的代码?那也就违背了MVVM的设计模式 啦,MVVMLight的消息通知能够实现互相调用代码而不耦合!c#
接着咱们上一篇文章的项目,也说过咱们这里要修改项目中的不足之处,让代码优雅起来。目前为止咱们一共有两个窗体(MainWindow
、UserView
),一个ViewModel(UserViewModel
)。咱们在使用MainWindow
弹出UserView
的时候是直接编写的MainWindow
中的Button
的Click
事件。这样使得MainWindow
掌握了业务逻辑,按理何时合理的弹出UserView
应该是编写ViewModel的人员来决定的。因此咱们应该把这个弹出窗口的权利交给ViewModel。设计模式
可是这样写,对吗?…要是View的编写人员尚未编写出UserView
这个类呢?是否是仍是没有脱离耦合?仍是有这样的依赖性,不是View依赖ViewModel,就是ViewModel依赖View,如何解决?mvvm
ViewModel是掌握业务逻辑的类,因此咱们这里广播一个消息,主意!我这里说的是广播!并非我要指定这个消息发送给谁。this
我在 UserViewModel.cs 中使用了以下代码进行了消息广播。spa
这个消息发送了个广播,广播的令牌为"ShowUserView"
,这是个令牌! 跟一个暗语同样,哈哈!只要对的上的就能够收到这个消息,因此咱们跟接收者(也就是编写View的工程师)进行约定。到时候接收消息就靠这个令牌了。设计
这里广播出去的参数是 Object 类型的,因为我什么参数都不须要传递因此我设定了 Send<T> 这个泛型为 object ,参数值为 null (也就是第一个参数)。code
约定好了一个令牌(这里是“ShowUserView”
),我在此注册该令牌,有该令牌的消息时我会收到这个通知,看看咱们在View中是如何注册消息并使用的吧!MainWindow.cs
的消息通知部分代码以下!htm
先看看注册MVVMLight消息的那行代码吧,Register<T> 这里是一个泛型是和咱们约定好的同样,我给了object类型,因此咱们构建的方法的时候也是要要有一个object类型的参数的方法ShowUserView(object obj)
。对象
ok,再继续看看这行代码后面的三个参数。
第一个:this
表示注册该消息的对象,也就是消息接收人的意思,因此我填写当前窗体。
第二个: "ShowUserView"
就是令牌了,跟ViewModel的编写人员约定好的。
第三个:收到消息时要执行的方法,这里咱们注册的是 ShowUserView(object obj)
这个方法。
至此,完美! 谁也不依赖谁!何时弹出窗体,这些业务逻辑交给ViewModel的编写人员吧。至于弹出什么窗体,窗体多漂亮,窗体怎么设置什么的,这就是编写View的事儿了。
有注册确定有注销咯,若是你不注销的话,这个注册会一直存在。若是你打开了两次MainWinodw则会注册两次。。两个窗体都开着那么收到一条消息的时候就会弹出4个UserView窗体..缘由很简单就是由于注册了两次。。。每一个窗体就收到两次。。
因此咱们在关闭窗体的时候或者你须要中止接收消息的时候来注销消息接受。。。到这里你应该明白 MVVMLight的消息注册机制是一个静态变量在App中全局广播与注册。带来的麻烦确实有,可是有时候也异常的方便。不会存在多个窗体接力传递对象过去使用的状况。
因此我这里在Unloaded
事件中对消息进行了注销,下面看看注销的代码
这个是注销当前对象的全部消息,若是你想注销指定的消息,那么是有重载的,能够指定令牌的名称,如“ShwoUsreView”,敲敲代码试试吧!以下所示!
本文示例源码下载:MVVMLightDemo_4
至此MVVMLight的消息通知就差很少啦,有疑问或者其余的建议…欢迎在此回复进行讨论!
欢迎阅读个人MVVMLight教程系列文章《关于 MVVMLight 设计模式系列》 MVVMLight相关的我会在该目录中进行补充。
转载请注明:王旭博客 » 使用 MVVMLight 消息通知