Prism_04_EventAggregator

在 MVVM 中,对于 View 和 ViewModel 之间的交互,可以使用 INotifyProperty 和 ICommand 来实现。而对于不同 ViewModel 之间的通信,为了实现低耦合,Prism 提供了 EventAggregator

EventAggregator 是基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯,且彼此之间没有直接引用。
在这里插入图片描述

IEventAggregator

EventAggregator 类在容器中是作为服务提供的,其对应的接口是 IEventAggregator.事件管理器用来定位和创建事件,其内部维护系统事件的集合。

public interface IEventAggregator
{
    TEventType GetEvent<TEventType>() where TEventType : EventBase;
}
发布事件
// 定义事件
public class TickerSymbolSelectedEvent : PubSubEvent<string>{}

// 发布者从 EventAggregator 中检索事件并调用 Publish 方法来发布事件
public class MainPageViewModel
{
    IEventAggregator _eventAggregator;
    public MainPageViewModel(IEventAggregator ea)
    {
        _eventAggregator = ea;
    }

    public void PublishEvent()
    {
        // 发布事件,然后拍拍屁股走人,不用负任何责任
        _eventAggregator.GetEvent<TickerSymbolSelectedEvent>().Publish("STOCK0");
    }
}
订阅事件
public class MainPageViewModel
{
    public MainPageViewModel(IEventAggregator ea)
    {
        ea.GetEvent<TickerSymbolSelectedEvent>().Subscribe(ShowNews);
    }

    void ShowNews(string companySymbol)
    {
        //implement logic
    }
}

订阅者在订阅事件的时候,可以根据不同需求来适当调整接收参数:

  • 线程调度 - 如果收到事件时需要更新UI元素,可以配置接收方法在UI线程上执行
  • 事件过滤 - 可以在订阅时提供过滤委托来过滤事件
  • 强引用 - 如果对事件有性能问题,可以在订阅时使用强引用委托,然后手动取消
  • 默认 - 如果上述都不适用,请使用默认订阅
订阅UI线程

默认情况下,订阅者在发布者的线程上接收事件。如果订阅者需要更新UI元素,在WPF中只有UI线程才可以更新UI元素,需要在订阅时指定线程。

public MainPageViewModel(IEventAggregator ea)
{
    ea.GetEvent<TickerSymbolSelectedEvent>().Subscribe(ShowNews, ThreadOption.UIThread);
}

参数 ThreadOption 还有其他可选项:

  • PublisherThread - 默认值,在发布者线程上接收事件
  • BackgroundThread - 在线程池上接收事件
  • UIThread - 在UI线程上接收事件
过滤事件

通常,订阅者不需要处理发布事件的每个实例,这时候需要订阅者使用过滤参数。

public class MainPageViewModel
{
    public MainPageViewModel(IEventAggregator ea)
    {
        TickerSymbolSelectedEvent tickerEvent = ea.GetEvent<TickerSymbolSelectedEvent>();
        // 通常,此过滤器作为 lambda 表达式;false表示不是强引用
        tickerEvent.Subscribe(ShowNews, ThreadOption.UIThread, false, 
                              companySymbol => companySymbol == "STOCK0");
    }

    void ShowNews(string companySymbol)
    {
        //implement logic
    }
}
强委托引用

如果在短时间内引发多个事件并担心性能问题,可以指定强委托引用。

  • true - 事件实例保持对订阅者实例的强引用,不允许订阅者被垃圾回收
  • false - 默认值,当订阅者被垃圾回收时,该事件自动取消订阅
退订事件
public class MainPageViewModel
{
    TickerSymbolSelectedEvent _event;
    public MainPageViewModel(IEventAggregator ea)
    {
        _event = ea.GetEvent<TickerSymbolSelectedEvent>();
        _event.Subscribe(ShowNews);
    }

    void Unsubscribe()
    {
        _event.Unsubscribe(ShowNews);
    }

    void ShowNews(string companySymbol)
    {
        //implement logic
    }
}
我的公众号 HelloPragram

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值