<StackPanel>
<Button Command="{Binding OpenCommand}" Content="事件" />
<Button Command="{Binding PublishCommand}" Content="发布消息"/>
<Button Command="{Binding CancelSubscribeCommand}" Content="取消订阅"/>
<TextBlock DockPanel.Dock="Bottom" Text="{Binding Message}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</StackPanel>
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
namespace ModuleA.ViewModels
{
public class ViewAViewModel : BindableBase
{//继承 BindableBase 基类, 实 MVVM 数据绑定,事件命令,消息发布和订阅
private readonly IEventAggregator m_EventAggregator;//发布订阅消息聚合器
private string _message;
public string Message
{
get { return _message; }
set { SetProperty(ref _message, value); }//双向数据绑定
}
public ViewAViewModel(IEventAggregator eventAggregator)
{
Message = "Prism ModuleA";
m_EventAggregator = eventAggregator;
//订阅 MessageEvent 类型的消息
//1.普通订阅
//m_EventAggregator.GetEvent<MessageEvent>().Subscribe(OnMessageReceived);
//2.过滤订阅,只订阅 Title=”新闻“ 的消息。
m_EventAggregator.GetEvent<MessageEvent>().Subscribe(OnMessageReceived, ThreadOption.PublisherThread, false, msg =>
{
if (msg.Title.Equals("新闻"))
return true;//接收消息
else
return false;//拒绝接收
});
OpenCommand = new DelegateCommand(() =>
{
Message = "OpenCommand";
});
PublishCommand = new DelegateCommand(() =>
{//发布消息
MessageEntity entity = new MessageEntity
{
Title = "新闻",
Description = "发布了一条新闻!",
};
m_EventAggregator.GetEvent<MessageEvent>().Publish(entity);
});
CancelSubscribeCommand = new DelegateCommand(() =>
{//取消订阅
m_EventAggregator.GetEvent<MessageEvent>().Unsubscribe(OnMessageReceived);
});
}
public void OnMessageReceived(MessageEntity entity)
{//处理订阅消息
Message = $"{entity.Title}:{entity.Description}";
}
public DelegateCommand PublishCommand { get; private set; }
public DelegateCommand OpenCommand { get; private set; }//点击事件,命令
public DelegateCommand CancelSubscribeCommand { get; private set; }
}
/// <summary>
/// 定义消息类型
/// </summary>
public class MessageEvent : PubSubEvent<MessageEntity>
{
}
/// <summary>
/// 消息实体类
/// </summary>
public class MessageEntity
{
public string Title { get; set; }
public string Description { get; set; }
}
}