MVVM模式实现了ViewModel和View的分离,但是有很多时候我们需要进行页面间通信

  比如,我们在设置界面修改了某个项的值,需要同步到主页面,让主页面做相关的逻辑,由于每个页面对应一个ViewModel,ViewModel之间又是独立的,很多MVVM实现都提供了EventAggregator来实现ViewModel之间的通信,其原理就是订阅与广播

EventAggregator原理

  1、消息订阅者向EventAggregator订阅消息

  2、消息发布者向EventAggregator发布消息

  3、EventAggregator想所有订阅该消息的订阅者发送

  4、订阅者接受到消息,进行相关的逻辑处理

EventAggregator可以保证ViewModel相互独立的情况下,实现ViewModel之间的交互

 

CM(Caliburn.Micro)也提供了对EventAggregator的支持

  消息以类型区分,比如两个ViewModel都订阅了string类型的消息,EventAggregator发送了一个字符串消息的时候,这两个ViewModel都会接收到,如果是不同的消息,需要进行区分

下面简单演示一下CM中EventAggregator的使用

1、ViewModel订阅消息

  MainViewModel订阅string 类型消息

public class MainViewModel : PropertyChangedBase, IHandle<string>
{
    private readonly INavigationService navigationService;

    public string Message { get; set; }
    public MainViewModel(INavigationService navigationService, IEventAggregator eventAggregator)
    {
        this.navigationService = navigationService;

        eventAggregator.Subscribe(this);
    }

    public void Nav2Page1()
    {
        navigationService.UriFor<Page1ViewModel>().Navigate();
    }

    #region 接受消息函数

    //接受string类型的消息
    public void Handle(string message)
    {
        Message = message;
        NotifyOfPropertyChange(() => Message);
    }

    #endregion
}
MainViewModel

相关文章: