这次是事件聚合器的应用。
事件聚合器应用第一步:定义一个事件聚合器,应该是一个可访问的公共区域,例14为它做了一个core的项目。代码很简单:
using Prism.Events; namespace UsingEventAggregator.Core { public class MessageSentEvent : PubSubEvent<string> { } }
一个继承了PubSubEvent<T>的空类,T的内容可以很多……
ModuleA定义了一个消息发送界面。
<StackPanel> <TextBox Text="{Binding Message}" Margin="5"/> <Button Command="{Binding SendMessageCommand}" Content="Send Message" Margin="5"/> </StackPanel>
对应VM中定义了发送命令
1 public class MessageViewModel : BindableBase 2 { 3 IEventAggregator _ea; 4 5 private string _message = "Message to Send"; 6 public string Message 7 { 8 get { return _message; } 9 set { SetProperty(ref _message, value); } 10 } 11 12 public DelegateCommand SendMessageCommand { get; private set; } 13 14 public MessageViewModel(IEventAggregator ea) 15 { 16 _ea = ea; 17 SendMessageCommand = new DelegateCommand(SendMessage); 18 } 19 20 private void SendMessage() 21 { 22 _ea.GetEvent<MessageSentEvent>().Publish(Message); 23 } 24 }
首先注入事件聚合器,然后在点击按钮的时候,让聚合器发布文本框内的内容。
然后看一下ModuleB怎样接收消息
界面:
<Grid> <ListBox ItemsSource="{Binding Messages}" /> </Grid>
一个列表框。
接收消息的逻辑
public class MessageListViewModel : BindableBase { readonly IEventAggregator _ea; private ObservableCollection<string> _messages; public ObservableCollection<string> Messages { get => _messages; set => SetProperty(ref _messages, value); } public MessageListViewModel(IEventAggregator ea) { _ea = ea; Messages = new ObservableCollection<string>(); _ea.GetEvent<MessageSentEvent>().Subscribe(MessageReceived); } private void MessageReceived(string message) { Messages.Add(message); } }
仍然是注入聚合器,然后在收到消息后,将消息加入到队列。