文章目录
前言
我们需要一个全局事件订阅发布功能,实现页面通讯。使两个毫无关系的页面通过一个中间量进行通讯。
代码
IEventAggregator:消息订阅集合
这个是Prism提供的消息订阅功能。使用如下
设置订阅类型,即关键字
java
PubSubEvent<>,<>里面存放的是订阅的数据类型,推荐使用元祖
///
public class EventClass : PubSubEvent<string>
{
}
官方案例,在ViewModel中使用
java
private readonly IEventAggregator eventAggregator;
public string MyTitle { get; set; }
public ViewAViewModel(IEventAggregator eventAggregator)
{
//通过Prism注入得到
this.eventAggregator = eventAggregator;
//订阅
eventAggregator.GetEvent<EventClass>().Subscribe(res =>
{
Debug.WriteLine(res.ToString());
});
//推送
eventAggregator.GetEvent<EventClass>().Publish("我是侧边栏传来的值:事件通知");
}
Tips:订阅中传递的值和EventClass: PubSubEvent<string> 中<>设置的类型有关。
但是经过我的测试,好像不能跨页面进行通讯。
逻辑修改
java
public partial class App
{
//在App.xaml中进行声明
public static IEventAggregator EventAggregator { get;set; } = new EventAggregator();
}
对应每个xxxView页面,都定义一个xxxViewEvent。
在每个ViewModel的构造函数中订阅自己的ViewEvent,这样别的页面直接对该Event进行推送即可达到路由传值。通过key,value的形式对返回值进行解析。
演示事例
java
public ViewAViewModel(IEventAggregator eventAggregator)
{
App.EventAggregator.GetEvent<ViewAEvent>().Publish("我是ViewModel传来的值");
App.EventAggregator.GetEvent<ViewAEvent>().Subscribe(res =>
{
Debug.WriteLine(res.ToString());
MyTitle = res;
});
}
总结
Prism和WPF给了我们很多的解决方案,但是其实我们只需要最简单又好用的解决方案即可。有了页面通讯,完全不需要路由通讯了。直接在页面跳转完成之后再页面通讯即可。统一而又优雅的解决方案才是我们需要的。