五、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之MVVM中的EventAggregator
这一篇我们主要再看完示例12、13后,写了个例子,用于再Modules下执行ApplicationCommands,使用IActiveAware执行当前View的Commands,或者ApplicationCommands下的Comands,主要是使用View和region解耦了他们之间的关系。
这一篇主要是看示例14,分析并学习EventAggregator。
从14示例继续学习Prism下的MVVM思想
1、引用关系
项目包含4个工程ModuleA、ModuleB、UsingEventAggregator、UsingEventAggregator.Core。
1.1、ModuleA引用了Prism.Wpf和UsingEvnetAggregator.Core;
1.2、ModuleB引用了Prism.Wpf和UsingEvventAggregator.Core;
1.3、UsingEventAggregator.Core引用了Prism.Core包;
1.4、UsingEventAggregator主工程引用了Prosm.unity、ModuleA、ModuleB、UsingEventAggregator.Core;
我们从引用关系最小的开始分析
2、UsingEventAggregator.Core工程
Core工程引用了Prism.Core
只包含了一个MessageSentEvent.cs类
MessageSenEvent继承自PubSubEvent,全部Core下只有这点代码。
我们先不管他是干啥的,去看其他的工程。
3、ModuleA工程
ModuleA工程引用了Prism.Wpf和UsingEventAggregator.Core
3.1 我们先观察ModuleAModule.cs
ModuleAModule继承自Prism.Modularity.IModule,再OnInitialized()方法中,关联了MessageView和显示区域LeftRegion的显示位置关系。
3.2观察Views下的MessageView.xaml
添加了命名空间prism,添加了prism:ViewModelLocator.AutoWireViewModel=true用于自动关联ViewModel
再MessageView.xaml中,主要有1个显示控件TextBox用于显示Message,一个Button按钮控件,用于执行SendMessageCommand命令的方法,cs文件中无新增内容
3.3观察ViewModels下的MessageViewModel.cs
在MessageViewModel文件中,MessageViewModel继承自BindableBase,添加了IEventAggregator事件聚合器的字段_ea,通过构造函数传入的IEventAggregator类型的对象赋初始值,
创建了Message属性,用于 绑定到界面的TextBox用于显示,
创建了DelegateCommand 命令SendMessageCommand,并在构造函数中初始化绑定了SendMessage()方法。
SendMessage()方法中,调用字段_ea对象的GetEvent().Publish(Message);
整个就结束了。看到这里我们还不知道在干啥,好像是从传入到ViewModel构造函数_ea对象获取一个事件,然后Publish一个对象出去,这个对象的类型是在UsingEventAggregator.Core中定义的。
忘记12 13示例的内容先,继续往下看。
4、ModuleB工程
ModuleB工程引用了Prism.Wpf、UsingEventAggregator.Core
4.1、先来观察入口的ModuleBModule.cs
ModuleBModule继承自Prism.Modularity.IModule,在OnInitialized()方法中关联了MessageList和显示区域RightRegion的显示位置关系。
4.2、观察Views下的MessageList.xaml
添加了命名空间prism,
添加了自动关联ViewModel的prism:ViewModelLocator.AutoWireViewModel=true属性。
设置了用于显示的列表控件,并绑定了ItemSource到VM下的Messages属性上,比较奇怪这里没有配置区域RgihtRegion,但是他们是不相关的,所以先不管。可能在别的地方,Prism的优势就在这里,这里就是显示ViewModel下的Messages的内容到ListBox控件上, cs文件中无额外代码。
4.3、观察ViewModels下的MessageListViewModel.cs
MessageListViewModel继承自BindableBase.
设置了字段IEventAggregator类型的_ea,并在构造函数中初始化了ea;
设置了ObServableCollection类型的对象Messages,并在构造函数中初始化了Messages;
在构造函数中使用_ea对象.GetEvent().Subscribe(MessageReceived),来订阅接收其他地方Publish的MessageSentEvent消息,在MessageReceived()方法中获取传入的参数,并添加到Messages中。
这里就是接收其他地方发送来的Publish的MessageSentEvent的消息。然后添加到自己的ObservableCollection中用于等待View的显示。
5、主工程UsingEventAggregator
UsingEventAggregator引用了Prism.unity、ModuleA、ModuleB、UsingEventAggregator.Core;
5.1、先看App.xaml
添加了命名空间prism,
修改Application为prism:Prism:PrismApplication,
去掉了StartUri属性
5.2、App.cs
修改App继承自PrismApplication,
重写了CreateShell()方法,并设置默认启动窗体
重写了ConfigureModuleCatalog()方法,并添加了ModuleAModule和ModuleBModule。
5.3Views下的MainWindow.xaml
添加了命名空间prism,和设置了附加依赖项属性prism:ViewModelLocator.AutoWireViewModel=true用于关联ViewModel,
添加了2个ContentControl控件,并设置了prism:RegionManager.RegionName="LeftRegion" 和prism:RegionManager.RegionName="RightRegion" 用于等待视图关联。cs文件中无额外代码
5.4ViewModels下的MainWindowViewModel.cs
MainWindowViewModel继承自BindableBase
添加了属性Title,用于显示在View下的Title
6运行示例代码并分析
前面分析完了所有的代码,我们运行起来
发现左侧是ModuleA下的MessageView,视图,点击Button后,会把输入的内容显示到右侧的ModuleB下的MessageList中,
回忆一下
ModuleA在ModuleAModule的OnInitialized()方法关联了MessageView视图和LeftRegion显示区域
ModuleB在ModuleBModule的OnInitialized()方法关联了MessageList视图和RightRion显示区域
UsingEventAggregator.Core中创建了MessageSentEvent:PubSubEvent
在ModuleA项目的ViewModel的构造函数中,接收了IEventAggregator类型的ea对象,并在View中的Button点击时触发的Command,使用这个对象ea到GetEvent.Publish方法发送了出去一个字符串。
在ModuleB项目的ViewModel的构造函数中,接收了IEventAggregator类型的ea对象,并在ViewModel的构造函数中使用ea对象的GetEvent.Subscribe()方法去订阅了ModuleA中发送的事件。整个过程就走完了。耦合性非常低。
这一篇就梳理完啦。这一篇和第13篇的IActiveAware配合使用效果更好,这篇比较简单,先不写Demo,继续往后看
我创建了一个C#相关的交流群。用于分享学习资料和讨论问题。欢迎有兴趣的小伙伴:QQ群:542633085
五、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之MVVM中的EventAggregator的更多相关文章
- 一、从GitHub浏览Prism示例代码的方式入门WPF下的Prism
最近这段时间一直在看一个开源软件PowerToys的源码,里面使用Modules的开发风格让我特别着迷,感觉比我现在写代码的风格好了太多太多.我尝试把PowerToys的架构分离了出来,但是发现代码维 ...
- 三、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Mvvm的08-12示例
这一篇是学习了前2篇RegionManager关联视图,和通过不同的方式加载Module示例之后的开始进入MVVM了. 从第08示例开始,进入了MVVM部分. 从08示例开始学习Prism下的MVVM ...
- 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式
这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...
- 四、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Mvvm的13示例
上一篇之分析了示例,没有最终写DEMO,把这一篇分析完,总结后一起写Prism下的MVVM例子. 这一篇开始分析从13示例开始,分析到MVVM主要部分结束然后写一个分析后的总结DEMO 添加一段新的内 ...
- 用git从github网站上下载代码的方式
原本单击如下下载按钮即可 但有时候github异常,该按钮无效,可以使用如下方法: 1.复制url,如https://github.com/ulli-kroll/mt7610u 2.进入要存放该代码的 ...
- AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- 编写css代码的方式
css(层叠样式表) 在一个网页中主要负责了页面的数据样式. 编写css代码的方式: 第一种: 在style标签中编写css代码. 只能用于本页面中,复用性不强 ...
- PHP常用代码大全(新手入门必备)
PHP常用代码大全(新手入门必备),都是一些开发中常用的基础.需要的朋友可以参考下. 1.连接MYSQL数据库代码 <?php $connec=mysql_connect("loc ...
- 微软的.NET示例代码放在Github上了
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:微软的.NET示例代码放在Github上了.
随机推荐
- kubernetes关闭基于角色的访问控制-匿名访问
1.关闭基于角色的访问控制 如果正在使用一个带有RBAC机制的Kubernetes集群,服务账户可能不会被授权访问API服务器(或只有部分授权).目前最简单的方式就是运行下面的命令查询API服务器,从 ...
- Kubernetes之Ingress
在Service篇里面介绍了像集群外部的客户端公开服务的两种方法,还有另一种方法---创建Ingress资源. 定义Ingress (名词)-进入或进入的行为;进入的权利;进入的手段或地点;入口. 接 ...
- Qt 新手实战项目之手把手打造一个串口助手
一前景 很多时候我们在学习一门新的语言,一直在学习各种语法和记住各种关键字,很容易产生枯燥的情绪,感觉学习这些玩意儿不知道用在什么地方,心里很是苦恼,这不,我在这记录下我学习Qt的第一个的小项目-串口 ...
- flutter中ListView的详细讲解
1.ListView的简单介绍 ListView是最常用的可以滚动组件之一, 它可以沿一个方向进行线性排列所有的子组件. 下面是ListView的属性值介绍: scrollDirection:列表的滚 ...
- Java核心反射机制
Java核心反射机制: 基本反射: 反射是一种动态类的处理机制,通过Class类来实现反射机制: Class类的基本信息: Module java.base Package java.lang Cla ...
- Error in render: "TypeError: Cannot read property '' of undefined"
描述 在用Vue的时候出现了一个令人窒息的错误 报错显示 "avatar" 未定义,但在postman中测试返回的数据确实有"avatar",可是为什么未找到? ...
- 12.10File类
要点提示:File类包含了获得一个文件/目录的属性,以及对文件/目录进行改名和删除的方法. 在文件系统中,每个文件都存放在一个目录下.绝对文件名,是由文件名和它的完整路径以及驱动器字母组成.例如,c: ...
- 无法push项目到gitlab的解决方案
gitlab项目组下创建项目 $ git push -u git@192.168.101.129:/DrvOps/Dev_Test : 报错信息如下: remote: ================ ...
- Java:Java的重写与重载区分
最明显的区别为:重写只存在于子类与父类中,重载存在于一个类中. 具体区别如下: 一.重写(override) override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重 ...
- spring boot j集成seagger 加入拦截器后 swagger 不能访问
一开始我是这样排除拦截的,但是发现没用 后来我发现swagger的真实访问路径是这样的 转自: https://blog.csdn.net/ab1991823/article/details/7906 ...