WPF MVVM框架------ Prism中的事件聚合器(IEventAggregator)

在.net中,事件的订阅和发布使用比较简单,但具有依赖关系。

Prism框架中提供的事件聚合器,可实现多点传送发布/订阅功能,可以用于ViewModel与ViewModel、ViewModel与View以及模块与模块之间的通信。这次主要实现viemodel之间的消息传递,将MainViewModel中的消息传递到RegionFirstViewModel,实现修改RegionFirstView界面上的数字

准备工作

MainView

模仿导航管理页面RegionManageView修改MainView布局,并实现对应的ViewModel中的Comnmand,实现导航功能

 

 

  MainViewModel 

public DelegateCommand<string> OpenViewCommand { get => _openViewCommand ?? new DelegateCommand<string>(DoAboutCommand); }
public DelegateCommand ReviseTitleCommand { get => _reviseTitleCommand ?? new DelegateCommand(DoReviseTitleCommand); }

private readonly IEventAggregator _eventAggregator;
  /// <summary>
  /// 通过构造函数注入事件聚合器eventAggregator
  /// </summary>
  /// <param name="regionManager"></param>
  /// <param name="eventAggregator"></param>
public MainViewModel(IRegionManager regionManager, IEventAggregator eventAggregator)
{
     this.regionManager = regionManager;
     this._eventAggregator = eventAggregator;
           
}

private void DoReviseTitleCommand()
{
    Task.Run(() => {
        for (int i = 0; i < 10; i++)
        {
            _eventAggregator.GetEvent<MessageArg>().Publish(i);
            Thread.Sleep(1000);
        }
    });
    
}
private void DoAboutCommand(string obj)
{
    regionManager.Regions["MainContent"].RequestNavigate(obj);
}
OpenViewCommand 是实现导航
ReviseTitleCommand 命令是实现消息发布的,在发布消息时,需要拿到消息类型,需要新建一个类,并继承PubSubEvent<TPayload>,该类用于维护订阅者列表,并实现向订阅者发送消息

MessageArg

RegionFirstViewModel

 当发布者发布消息时,就会执行订阅者的方法OnSubscribe(),从而达到修改Name的效果,在RegionFirstView界面就可以看到最底下在文本框的数字在变化

 

 事件过滤

在订阅的时候,不同的订阅者可能想要获得的信息不一样,这是后就需要对于传递的消息进行过滤

//ThreadOption 指定在哪个线程上接收委托回调     PublisherThread与发布者在同一线程执行
_eventAggregator.GetEvent<MessageArg>().Subscribe(OnSubscribe, ThreadOption.PublisherThread, false, MessageFilter);
private bool MessageFilter(int obj)
{
    return obj % 2 == 0;
}

在这里对传过来的数值进行过滤,不符合   obj % 2 == 0  这个条件的数值都会被过滤掉

订阅线程

在默认情况下,订阅者在发布者的线程上接收事件,当我们想要在更新界面上的控件时,就需要在UI线程进行更新,就可以配置为  ThreadOption.UIThread  ,这样就可以直接更新控件。

当配置为 ThreadOption.BackgroundThread 时,订阅者会在线程池中接收事件

总结:

1.使用方法

  1)通过构造函数注入获取事件聚合器

  2)定义一个事件类型通道类MessageArg,继承自PubSubEvent,用于维护订阅者列表并传递发布者消息

  3)订阅 _eventAggregator.GetEvent<MessageArg>().Subscribe(OnSubscribe, ThreadOption.PublisherThread, false, MessageFilter);

  4)发布_eventAggregator.GetEvent<MessageArg>().Publish(123);

2.注意

  及时取消订阅,可以避免太多不必要的订阅而导致性能问题

  设置为弱引用时,可被被垃圾回收

 

 

 

 

 

posted @ 2023-03-07 19:26  just--like  阅读(1138)  评论(0编辑  收藏  举报