使用 MVVMLight 消息通知

欢迎阅读我的MVVMLight教程系列文章关于 MVVMLight 设计模式系列

在文章的其实我们就说了,MVVMLight的精华就是消息通知机制,设计的非常不错。这个东西在MVVMLight可以说是用的及其的频繁,当 ViewModel请求View要有些改变的时候(比如弹个窗体)那么你在ViewModel里面编写弹窗的代码?那也就违背了MVVM的设计模式 啦,MVVMLight的消息通知可以实现互相调用代码而不耦合!

如何使用 MVVMLight 消息通知

接着我们上一篇文章的项目,也说过我们这里要修改项目中的不足之处,让代码优雅起来。目前为止我们一共有两个窗体(MainWindowUserView),一个ViewModel(UserViewModel)。我们在使用MainWindow弹出UserView的时候是直接编写的MainWindow中的ButtonClick事件。这样使得MainWindow掌握了业务逻辑,按理什么时候合理的弹出UserView应该是编写ViewModel的人员来决定的。所以我们应该把这个弹出窗口的权利交给ViewModel。

或许至此你会想在ViewModel中编写如下代码?

  1. UserView uv = new UserView();
  2. uv.Show()

但是这样写,对吗?…要是View的编写人员还没有编写出UserView这个类呢?是不是还是没有脱离耦合?还是有这样的依赖性,不是View依赖ViewModel,就是ViewModel依赖View,如何解决?

下面我们来看看MVVMLight中的解决办法 – 消息通知

ViewModel是掌握业务逻辑的类,所以我们这里广播一个消息,主意!我这里说的是广播!并不是我要指定这个消息发送给谁

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

  1. Messenger.Default.Send<object>(null, "ShowUserView");

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

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

接收MVVMLight的消息

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

  1. public MainWindow()
  2. {
  3. this.DataContext = new MainWindowViewModel();
  4. InitializeComponent();
  5. //注册MVVMLight消息
  6. Messenger.Default.Register<object>(this, "ShowUserView", ShowUserView);
  7. //卸载当前(this)对象注册的所有MVVMLight消息
  8. this.Unloaded += (sender, e) => Messenger.Default.Unregister(this);
  9. }
  10. //弹出UserView窗体
  11. void ShowUserView(object obj)
  12. {
  13. new UserView().Show();
  14. }

先看看注册MVVMLight消息的那行代码吧,Register<T> 这里是一个泛型是和我们约定好的一样,我给了object类型,所以我们构建的方法的时候也是要要有一个object类型的参数的方法ShowUserView(object obj)

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

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

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

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

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

似乎还有个没讲…..卸载消息?

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

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

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

  1. Messenger.Default.Unregister(this);

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

  1. Messenger.Default.Unregister<object>(this, "ShowUserView");

 本文示例源码下载MVVMLightDemo_4

至此MVVMLight的消息通知就差不多啦,有疑问或者其他的建议…欢迎在此回复进行讨论!

欢迎阅读我的MVVMLight教程系列文章关于 MVVMLight 设计模式系列》 MVVMLight相关的我会在该目录中进行补充。

转载请注明:王旭博客 » 使用 MVVMLight 消息通知

继续浏览有关 c#MessengerMVVMMVVMLight消息通知 的文章使用 MVVMLight 消息通知

使用 MVVMLight 消息通知

时间: 2024-10-14 22:00:54

使用 MVVMLight 消息通知的相关文章

高仿微信5.2.1主界面架构 包含消息通知

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25708045 一哥们去新疆前给了我个任务,就是整这东西,哥们回来了,赶紧做了个,哈哈,可惜没给我带切糕. 新版微信的效果,一眼看上去准备用ViewpagerIndicator来实现,但是需要在Indicator的后面添加消息通知(BadgeView),可惜没有办法自定义Indicator,最后还是自己写了个实现. 主结构:ViewPager和FragmentPagerAdapt

IOS 新消息通知提示-声音、震动

一.APNS 1.注册 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];复制代码2.服务器推送(JAVA) PushNotificationPayload payLoad =  PushNotificationPayl

Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间

Redis 小白指南(三)- 事务.过期.消息通知.管道和优化内存空间 简介 <Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍> 讲的是 Redis 的介绍,以及如何在 Windows 上安装并使用,一些 GUI 工具和自己简单封装的 RedisHelper. <Redis 小白指南(二)- 聊聊五大类型:字符串.散列.列表.集合和有序集合>讲的是 Redis 中最核心的内容,最常用的就是和数据类型打交道. 目录 事务 过期时间 消息通知 管道 优化内存空间

消息通知

传统方法: 实现方式:通过闪烁页面的标题 实现方法:使用定时器不断地修改document.title的值 var titleInit = document.title, isShine = true; setInterval(function () { var title = document.title; if (isShine == true) { if (/新/.test(title) == false) { document.title = '[你有新消息]'; } else { doc

Android消息通知-Notifation

Android中常用的消息提醒,一种是Toast弹出提醒内容,一种是AlterDialog弹出框来提醒用户,还有一种就是消息通知的,用Android经常收到各种通知就是Notifation.Notification是一种具有全局效果的通知,展示在屏幕顶端,表现一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容. Notifation概念 Android很多东西存在版本兼容性问题Android3.0是一个之前在其之前构建Notification推荐使用Notification.Builde

iOS消息通知 小红点&amp;自定义小红点&amp;应用图标添加提示

//添加消息通知 小红点iOS自带 NSArray *tabBarItems = self.navigationController.tabBarController.tabBar.items; UITabBarItem *personCenterTabBarItem = [tabBarItems objectAtIndex:2]; personCenterTabBarItem.badgeValue = @"1"; //自定义方法(还需完善) UIImageView *dotImage

基于Animate.css的炫酷jQuery消息通知框插件

notification是一款基于Animate.css的炫酷jQuery消息通知框插件.该插件可以在屏幕的四个角显示消息通知框,结合Animate.css可以制作出多种效果非常炫酷的CSS3动画特效. 在线预览   源码下载 使用方法 使用该jQuery消息通知框插件需要引入jQuery,notification.js,animate.css和notification.css文件. <link rel='stylesheet' href='css/animate.min.css'> <

iOS开发-消息通知机制(NSNotification和NSNotificationCenter)

iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多,类之间的传值用到的比较多,不过委托相对来说只能是一对一,比如说页面A跳转到页面B,页面的B的值改变要映射到页面A,页面C的值改变也需要映射到页面A,那么就需要需要两个委托解决问题.NSNotificaiton则是一对多注册一个通知,之后回调很容易解决以上的问题. 基础概念 iOS消息通知机制算是同步的,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完

HTML 5的消息通知机制

译文来源:http://www.ido321.com/1130.html 原文:HTML 5 Notification 译文:HTML 5 的消息通知机制 译者:dwqs HTML 5 已经被应用到Web开发中.跟平常一样,任何一个软件新版本的发布都期待一些新的特性,这对HTML 5也不例外.为了仅仅通过HTML提高用户交互,HTML 5已经提供了很多新的API. 是不是非常有趣呢?并且HTML 5已经和CSS 3结合的非常棒了. 因此,我也开始写一系列与HTML 5的API相关的文章来介绍AP