使用 MVVMLight 消息通知
欢迎阅读我的MVVMLight教程系列文章《关于 MVVMLight 设计模式系列》
在文章的其实我们就说了,MVVMLight的精华就是消息通知机制,设计的非常不错。这个东西在MVVMLight可以说是用的及其的频繁,当ViewModel请求View要有些改变的时候(比如弹个窗体)那么你在ViewModel里面编写弹窗的代码?那也就违背了MVVM的设计模式啦,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<object>(null, "ShowUserView");
这个消息发送了个广播,广播的令牌为"ShowUserView"
,这是个令牌! 跟一个暗语一样,哈哈!只要对的上的就可以收到这个消息,所以我们跟接收者(也就是编写View的工程师)进行约定。到时候接收消息就靠这个令牌了。
这里广播出去的参数是 Object 类型的,由于我什么参数都不需要传递所以我设定了 Send<T> 这个泛型为 object ,参数值为 null (也就是第一个参数)。
接收MVVMLight的消息
约定好了一个令牌(这里是“ShowUserView”
),我在此注册该令牌,有该令牌的消息时我会收到这个通知,看看我们在View中是如何注册消息并使用的吧!MainWindow.cs
的消息通知部分代码如下!
- public MainWindow()
- {
- this.DataContext = new MainWindowViewModel();
- InitializeComponent();
- //注册MVVMLight消息
- Messenger.Default.Register<object>(this, "ShowUserView", ShowUserView);
- //卸载当前(this)对象注册的所有MVVMLight消息
- this.Unloaded += (sender, e) => Messenger.Default.Unregister(this);
- }
- //弹出UserView窗体
- void ShowUserView(object obj)
- {
- new UserView().Show();
- }
先看看注册MVVMLight消息的那行代码吧,Register<T> 这里是一个泛型是和我们约定好的一样,我给了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<object>(this, "ShowUserView");
本文示例源码下载:MVVMLightDemo_4
至此MVVMLight的消息通知就差不多啦,有疑问或者其他的建议…欢迎在此回复进行讨论!
欢迎阅读我的MVVMLight教程系列文章《关于 MVVMLight 设计模式系列》 MVVMLight相关的我会在该目录中进行补充。
转载请注明:王旭博客 » 使用 MVVMLight 消息通知
http://www.taodudu.cc/news/show-6296584.html
相关文章:
- UnityLightmass
- 【Flutter】如何完成一个透明沉浸式状态栏
- ant design vue:upload打开选择文件弹框前弹出确认框
- 关于Java调用dll文件的一系列问题(持续更新)
- HDFS的常用操作--hdfs下的文件操作常用命令总结
- 家庭摄像头隐私保护存在漏洞,央视提醒:信息安全可能无法保障
- OpenCV摄像头-截图
- 摄像头P2P软件提供,完美解决打洞及音视频、用户码传输问题。
- 电脑虚拟摄像头 -obs及obs虚拟摄像头插件(免费)
- 解决OpenCV捕捉USB摄像头时抓帧失败的问题
- 网络摄像头密码穷举
- 安信可ESP32-CAM摄像头开发demo--局域网拍照、实时视频、人脸识别
- cv2.VideoCapture(0)获取USB摄像头失败解决方案
- 来吧,展示。互联网术语
- 网络技术术语大全
- 一些常见网络安全术语
- 网络名词术语解释
- 网络技术领域专业术语解释大全-170个术语
- 计算机网络专用术语基本概念
- 网络安全专业术语对照
- 网络技术这十个术语你知道吗?
- 常用网络术语集合
- 寄快递没有那么贵,大件这样寄才便宜!!!
- 如何查询大量DHL国际快递物流轨迹、签收情况
- 四大国际快递时效、优势对比
- 中国到欧洲专线快递要多长时间
- 到墨西哥的液体货物国际快递怎么邮寄
- 推荐一个好的查询快递的网站给大家。
- 56个国内常用快递公司网址
- 食品如何寄国际快递到美国
使用 MVVMLight 消息通知相关推荐
- WPF基础布局样式模板消息通知 框架
1.布局 先主体框架,再细节填充. 这个属性很有用 2.样式 可以批量设置属性.像css一样. 3.模板 4.绑定 4种绑定模式,多绑定,格式化. 5.消息通知 注册消息,发送消息 ,利用框架等. 6 ...
- [UWP]实现一个轻量级的应用内消息通知控件
[UWP]实现一个轻量级的应用内消息通知控件 原文:[UWP]实现一个轻量级的应用内消息通知控件 在UWP应用开发中,我们常常有向用户发送一些提示性消息的需求.这种时候我们一般会选择MessageDi ...
- Redis消息通知系统的实现
Redis消息通知系统的实现 Posted on 2012-02-29 by 老王 http://huoding.com/2012/02/29/146 最近忙着用Redis实现一个消息通知系统,今天大 ...
- SCOM警报通知新特性:即时消息通知
使用过SCOM的朋友应该了解,相对MOM,SCOM增加了"即时消息"和"短信"两种警报通知方式.今天我将给大家介绍其中之一,"即时消息"告警 ...
- NSNotification消息通知实现源码(观察者模式原理)
先简单介绍苹果封装的消息通知,再献上根据观察者模式原理实现的源码供参考. 消息通知 对于观察者模式,苹果封装了消息通知(NSNotification)和通知中心(NSNotificationCente ...
- html 消息通知功能,HTML5之消息通知的使用(Web Notification)
关于 HTML5 ,写了不少文章,总觉得相关的高级 API 都得过一遍.系统的了解,站在更高的高度去思考问题,这样才能事半功倍. 一.先睹为快 我们先来尝试一个最简单的例子,打开 chrome 开发者 ...
- Laravel——消息通知
有的时候,在做一些业务的时候,可能会遇到这么个需求.那就是,别人评论了你的某个东西,或者是关注你,再或者是收藏了你的文章,那么作者,应该是需要被通知一下,以展现一下作者该有的成果,也可以满足一下作者小 ...
- Java中集成极光推送实现给Android提送消息通知(附代码下载)
场景 Android中集成极光推送实现推送消息通知与根据别名指定推送附示例代码下载: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...
- Android中集成Jpush实现推送消息通知与根据别名指定推送附示例代码下载
场景 经常会有后台服务向Android推送消息通知的情况. 实现 首先在Android Studio中新建一个Android应用 在Project根目录的build.gradle中配置了jcenter ...
最新文章
- LSGO:祝大家新年快乐!
- Step1帐户登录系统(6.使用OpenID登录网站)
- PullToRefreshListView下拉刷新与上拉载入
- Sql Server 日志清理 (数据库压缩方法)
- java xml 追加,java – 如何将节点从xml文档追加到现有的xml文档
- python basemap的安装
- android 模拟器 3D 开发环境配置
- JAVA接口继承、抽象类等
- 微服务学习之服务治理、服务注册与发现、Eureka【Hoxton.SR1版】
- 计算机网络与多媒体专科测试,上海第二工业大学2021年专科层次依法自主招生生考试职业技能测试考纲...
- 使用libxml2库生成和解析文件
- 支付宝 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足,建议在开发者中心检查签约是否已经生效
- java free hd 798,[https://www.798ziyuan.com/]Java入门级项目全程实录V2.0
- vc c语言标准库头文件,VC++ 6.0中添加库文件和头文件
- 33c3 CTF web WriteUp
- java依赖倒转原则_设计原则之--依赖倒转原则
- 小汽车的位置(二维坐标运算)
- 关于ftp操作中被动模式(Passive Mode)是什么意思?
- DynamicDto链式实现动态数据传输对象
- 2015百度之星复赛(hdu5258 - 5262)