我是靠谱客的博主 精明绿草,最近开发中收集的这篇文章主要介绍用 MVVMLight 消息通知的写法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如何使用 MVVMLight 消息通知
目前为止我们一共有两个窗体(MainWindow、UserView),一个ViewModel(UserViewModel)。我们在使用MainWindow弹出UserView的时候是直接编写的MainWindow中的Button的Click事件。这样使得MainWindow掌握了业务逻辑,按理什么时候合理的弹出UserView应该是编写ViewModel的人员来决定的。所以我们应该把这个弹出窗口的权利交给ViewModel。

或许至此你会想在ViewModel中编写如下代码?
UserView uv = new UserView();
uv.Show()
但是这样写,对吗?…要是View的编写人员还没有编写出UserView这个类呢?是不是还是没有脱离耦合?还是有这样的依赖性,不是View依赖ViewModel,就是ViewModel依赖View,如何解决?

下面我们来看看MVVMLight中的解决办法 – 消息通知
ViewModel是掌握业务逻辑的类,所以我们这里广播一个消息,主意!我这里说的是广播!并不是我要指定这个消息发送给谁。

我在 UserViewModel.cs 中使用了如下代码进行了消息广播。

Messenger.Default.Send(null, “ShowUserView”);
这个消息发送了个广播,广播的令牌为"ShowUserView",这是个令牌! 跟一个暗语一样,哈哈!只要对的上的就可以收到这个消息,所以我们跟接收者(也就是编写View的工程师)进行约定。到时候接收消息就靠这个令牌了。

这里广播出去的参数是 Object 类型的,由于我什么参数都不需要传递所以我设定了 Send 这个泛型为 object ,参数值为 null (也就是第一个参数)。

接收MVVMLight的消息
约定好了一个令牌(这里是“ShowUserView”),我在此注册该令牌,有该令牌的消息时我会收到这个通知,看看我们在View中是如何注册消息并使用的吧!MainWindow.cs 的消息通知部分代码如下!

public MainWindow()
{
this.DataContext = new MainWindowViewModel();
InitializeComponent();

//注册MVVMLight消息

Messenger.Default.Register(this, “ShowUserView”, ShowUserView);

//卸载当前(this)对象注册的所有MVVMLight消息
this.Unloaded += (sender, e) => Messenger.Default.Unregister(this);

}

//弹出UserView窗体
void ShowUserView(object obj)
{
new UserView().Show();
}
先看看注册MVVMLight消息的那行代码吧,Register 这里是一个泛型是和我们约定好的一样,我给了object类型,所以我们构建的方法的时候也是要要有一个object类型的参数的方法ShowUserView(object obj)。

ok,再继续看看这行代码后面的三个参数。

第一个:this 表示注册该消息的对象,也就是消息接收人的意思,所以我填写当前窗体。

第二个: “ShowUserView” 就是令牌了,跟ViewModel的编写人员约定好的。

第三个:收到消息时要执行的方法,这里我们注册的是 ShowUserView(object obj) 这个方法。

至此,完美! 谁也不依赖谁!什么时候弹出窗体,这些业务逻辑交给ViewModel的编写人员吧。至于弹出什么窗体,窗体多漂亮,窗体怎么设置什么的,这就是编写View的事儿了。

似乎还有个没讲……卸载消息?
有注册肯定有注销咯,如果你不注销的话,这个注册会一直存在。如果你打开了两次MainWinodw则会注册两次。。两个窗体都开着那么收到一条消息的时候就会弹出4个UserView窗体…原因很简单就是因为注册了两次。。。每个窗体就收到两次。。

所以我们在关闭窗体的时候或者你需要停止接收消息的时候来注销消息接受。。。到这里你应该明白 MVVMLight的消息注册机制是一个静态变量在App中全局广播与注册。带来的麻烦确实有,但是有时候也异常的方便。不会存在多个窗体接力传递对象过去使用的情况。

所以我这里在Unloaded事件中对消息进行了注销,下面看看注销的代码

Messenger.Default.Unregister(this);
这个是注销当前对象的所有消息,如果你想注销指定的消息,那么是有重载的,可以指定令牌的名称,如“ShwoUsreView”,敲敲代码试试吧!如下所示!

Messenger.Default.Unregister(this, “ShowUserView”);

最后

以上就是精明绿草为你收集整理的用 MVVMLight 消息通知的写法的全部内容,希望文章能够帮你解决用 MVVMLight 消息通知的写法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部