这一篇我们主要再看完示例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的更多相关文章

  1. 一、从GitHub浏览Prism示例代码的方式入门WPF下的Prism

    最近这段时间一直在看一个开源软件PowerToys的源码,里面使用Modules的开发风格让我特别着迷,感觉比我现在写代码的风格好了太多太多.我尝试把PowerToys的架构分离了出来,但是发现代码维 ...

  2. 三、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Mvvm的08-12示例

    这一篇是学习了前2篇RegionManager关联视图,和通过不同的方式加载Module示例之后的开始进入MVVM了. 从第08示例开始,进入了MVVM部分. 从08示例开始学习Prism下的MVVM ...

  3. 二、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Modules的几种加载方式

    这一篇梳理Prism中07示例Module的几种加载方式. 07示例分为了5个,有5种不同的Module加载方式. 我们开始学习加载Modules 观察07-Modules-Appconfig示例 分 ...

  4. 四、从GitHub浏览Prism示例代码的方式入门WPF下的Prism之Mvvm的13示例

    上一篇之分析了示例,没有最终写DEMO,把这一篇分析完,总结后一起写Prism下的MVVM例子. 这一篇开始分析从13示例开始,分析到MVVM主要部分结束然后写一个分析后的总结DEMO 添加一段新的内 ...

  5. 用git从github网站上下载代码的方式

    原本单击如下下载按钮即可 但有时候github异常,该按钮无效,可以使用如下方法: 1.复制url,如https://github.com/ulli-kroll/mt7610u 2.进入要存放该代码的 ...

  6. AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  7. 编写css代码的方式

            css(层叠样式表) 在一个网页中主要负责了页面的数据样式.       编写css代码的方式:       第一种: 在style标签中编写css代码. 只能用于本页面中,复用性不强 ...

  8. PHP常用代码大全(新手入门必备)

    PHP常用代码大全(新手入门必备),都是一些开发中常用的基础.需要的朋友可以参考下.   1.连接MYSQL数据库代码 <?php $connec=mysql_connect("loc ...

  9. 微软的.NET示例代码放在Github上了

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:微软的.NET示例代码放在Github上了.

随机推荐

  1. Docker 镜像针对不同语言的精简策略

    导航: 这里分为几个部分. 相关转载云原生:米开朗基杨 1.Docker减小镜像体积 2.Docker镜像针对不同语言的精简策略 对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积 ...

  2. 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)

    1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...

  3. 快速了解ARP

    目录 前言 一.MAC 1.MAC地址三种帧 二.ARP 1.五种ARP 三.ARP老化 四.什么时候会发送免费ARP 五.代理ARP 六.ARP欺骗 总结 前言 分别介绍MAC地址和五种ARP报文 ...

  4. 13、mysql主从复制原理解析

    13.1.mysql主从复制介绍: 1.普通文件,磁盘上的文件的同步方法: (1)nfs网络文件共享可以同步数据存储: (2)samba共享数据: (3)ftp数据同步: (4)定时任务:cronta ...

  5. 自定义组件开发:使用v-model封装el-pagination组件

    1.前言 通过封装el-pagination组件开发自定义分页组件的类似文章网上已经有很多了,但看了一圈,总是不如意,于是决定还是自己动手搞一个. 2.背景 2.1.常规分页处理方法 利用el-pag ...

  6. hbuilder 开发app 自动升级

    使用huilder 开发app  ,实现app升级功能 1. var wgtVer = null; //用于获取系统当前版本 var currentversion = null; //用于获取系统最新 ...

  7. CRM系统对企业管理的作用有多大?

    随着市场经济的发展,对任何行业的企业来说,客户都是非常重要的一个部分.CRM系统帮助企业做到以客户为中心,它可以根据客户的具体要求进行跟进和反馈,在很大程度上提高公司的客户服务水平和客户满意度,进而提 ...

  8. css文字动画(自动换文字)

    html: <div class="content"> <div class="content__container"> <p c ...

  9. 20道Java实习生笔试面试选择题(内附答案解析)

    ​1.以下对继承的描述错误的是(A) A.Java中的继承允许一个子类继承多个父类 B.父类更具有通用性,子类更具体 C.Java中的继承存在的传递性 D.当实例化子类时会递归调用父类中的构造方法 解 ...

  10. python使用笔记25--深拷贝、浅拷贝

    1.循环删除list 1 ll = [1,1,32,4,3,2,3,2,4,6,4,5,6,7,8] 2 for i in ll: 3 if i % 2 !=0: 4 ll.remove(i) 5 p ...