从PRISM开始学WPF(六)MVVM(三)事件聚合器EventAggregator?

时间:2021-11-14 03:21:14

从PRISM开始学WPF(一)WPF?

从PRISM开始学WPF(二)Prism?

从PRISM开始学WPF(三)Prism-Region?

从PRISM开始学WPF(四)Prism-Module?

从PRISM开始学WPF(五)MVVM(一)ViewModel?

从PRISM开始学WPF(六)MVVM(二)Command?

从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator?

Event aggregation. For communication across view models, presenters, or controllers when there is not a direct action-reaction expectation.

(⊙﹏⊙),Google一下:

事件聚合。在没有直接的步履反响期望的情况下,跨视图模型,演示者或控制者进行通信。

1是没有直接步履反响期望,2跨视图通信

在具体了解这个观点之前,先看一个例子:

通过简介,很容易想到聊天窗口,当你在一个视图A中输入文字点击发送之后,此外一个视图B会接收到这个动静,并将文字输出到屏幕上,而这个时候,视图A并不关心谁将收到信息,只管提交,视图B也不管是谁发来的动静,只管接收,并显示。

关门,放代码:

Setp1 在Shell窗口中,界说两个Region,分袂来展示发送视图和接收视图

<Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <ContentControl prism:RegionManager.RegionName="LeftRegion" /> <ContentControl Grid.Column="1" prism:RegionManager.RegionName="RightRegion" /> </Grid>

今天Typora更新了,代码块撑持xaml格局,以前都是用xml-dtd,下面统一使用xaml
XAML

这应该是教程中呈现的对照庞大的xaml,对照详细的使用了Grid,这里的Grid很像一个表格,在使用他构造之前,需要界说好列数,下面的代码为Grid设置了两个列

<Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions>

那么能加行吗?那是固然的了,下面是为Grid添加两行,Height的Auto暗示这个行的高度会按照内容高度进行适应:

<Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions>

在使用Grid的时候,需要为控件指定Grid的位置Grid.Column="1",1就是下标,都是从0开始的,1就代表第二列,当你不指定具体位置的时候,默认将控件插入Grid的0行0列,上面的LeftRegion就是在首行首列的位置。

Setp2 新建两个Module,分袂为ModuleA 和 ModuleB,ModuleA中的视图用来发送信息,ModuleB中的视图用来接收显示信息。

Module的创建在第四节已经说明了

先看ModuleA的发送视图:

MessageView.xaml

<StackPanel> <TextBox Text="{Binding Message}" Margin="5"/> <Button Command="{Binding SendMessageCommand}" Content="Send Message" Margin="5"/> </StackPanel>

MessageView中界说了一个文本框,进行了数据绑定,,然后是一个按钮,绑定了一个SendMessageCommand命令。在我们点击Send Message按钮的时候,就会将Message显示到接收视图里去。

再看ModuleB的显示视图:

MessageList.xaml

<Grid> <ListBox ItemsSource="{Binding Messages}" /> </Grid>

就界说了一个ListBox来显示Message。ItemsSource绑定的应该是一个调集,不然怎么叫Source呢?

接下来,看下Prism怎么实现跨视图模型通讯:

首先,界说一个MessageSentEvent类,担任PubSubEvent<string>,string是因为这个事件接收的payload是字符串类型,PubSubEvent<T>类卖力连接颁布者和订阅者,他卖力维护订阅者列表并措置惩罚惩罚事件派发给订阅者。

using Prism.Events; namespace UsingEventAggregator.Core { public class MessageSentEvent : PubSubEvent<string> { } }

然后我们看下MessageViewModel:

using Prism.Commands; using Prism.Events; using Prism.Mvvm; using UsingEventAggregator.Core; namespace ModuleA.ViewModels { public class MessageViewModel : BindableBase { IEventAggregator _ea; private string _message = "Message to Send"; public string Message { get { return _message; } set { SetProperty(ref _message, value); } } public DelegateCommand SendMessageCommand { get; private set; } public MessageViewModel(IEventAggregator ea) { _ea = ea; SendMessageCommand = new DelegateCommand(SendMessage); } private void SendMessage() { _ea.GetEvent<MessageSentEvent>().Publish(Message); } } }

先看我们熟悉的部分:

private string _message = "Message to Send"; public string Message { get { return _message; } set { SetProperty(ref _message, value); } }

这是<TextBox Text="{Binding Message}" Margin="5"/>中的Message

然后界说了一个DelegateCommand

public DelegateCommand SendMessageCommand { get; private set; }

接下来就是EventAggregator部分了:

首先界说一个依赖注入点:

IEventAggregator _ea;