zoukankan      html  css  js  c++  java
  • 五、从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

  • 相关阅读:
    .globl分析
    ARM汇编指令
    汇编文件后缀.s与.S
    Uboot命令
    BIOS、BootLoader、uboot对比
    汇编的WEAK关键字
    USB OTG
    前端学习笔记——CSS选择器
    前端学习笔记——HTML
    【1】python模块:自定义模块的3种导入方式
  • 原文地址:https://www.cnblogs.com/duwenlong/p/15130458.html
Copyright © 2011-2022 走看看