将多个参数传递给Prism的EventAggregator

Bla*_*ord 4 wpf prism mvvm eventaggregator

我正在使用Prism的EventAggregator在模块的ViewModel之间进行松散耦合的通信.我在ViewModelA中有几个属性(例如FirstName,LastName),当它们的值发生变化时需要更新ViewModelB中的属性.我目前的解决方案是:

ViewModelA发布一个Event,其中FirstName的新值作为有效负载:

 public string FirstName
    {
        get {return firstName;}
        set 
        {
            this.firstName = value;
            eventAggregator.GetEvent<PatientDetailsEvent>().Publish(firstName);
        }
    }
Run Code Online (Sandbox Code Playgroud)

ViewModelB订阅了Event并相应地更改了其FirstName属性:

public PatientBannerViewModel(IEventAggregator eventAggregator)
    {
        this.eventAggregator = eventAggregator;
        eventAggregator.GetEvent<PatientDetailsEvent>().Subscribe(UpdateBanner, ThreadOption.UIThread);
    }

    public void UpdateBanner(string firstName)
    {
        this.FirstName = firstName;
    }
Run Code Online (Sandbox Code Playgroud)

这适用于单个属性.它不为多个不同性质的工作,因为ViewModelB不知道什么属性对改变ViewModelA.ViewModelB知道新值是什么,但它不知道要更新哪个属性.

我可以为每个属性创建单独的事件,但这似乎是重复的.只使用一个事件似乎更干净.理想情况下,在发布事件时,ViewModelA应该告诉ViewModelB哪个属性已更改.我怎样才能做到这一点?

Bla*_*ord 7

对不起,我在这篇文章中找到了我的问题的答案.Rachel Lim撰写的这篇博文也很有帮助.

我们需要的是ViewModelA(发布者)告诉ViewModelB(订阅者)两条信息:

  1. ViewModelA上的属性发生了哪些变化
  2. 这个属性的新价值是多少?

我们需要传达2条信息(即属性),但Prism的EventAggregator只需要一个参数,即payload.这就是问题.

要通过EventAggregator 传递多条信息(属性),您可以发布一个类的实例,该类将这些属性定义为EventAggregator payload.我调用了这个类PatientDetailsEventParameters,它定义了两个属性:

public class PatientDetailsEventParameters
{
    public string PatientProperty { get; set; }
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我在基础结构程序集(我定义我的事件的同一个地方)中创建了这个类,我的所有其他程序集都引用了它.

然后,您可以将此类的实例发布为有效内容(而不是仅包含1个值的字符串).这允许将多个参数传递到有效载荷中.

public string FirstName
    {
        get 
        {
            return firstName;
        }
        set 
        {
            this.firstName = value;
            eventAggregator.GetEvent<PatientDetailsEvent>().Publish(new PatientDetailsEventParameters() {Value = firstName, PatientProperty = "firstName"});
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以在此处看到,在发布PatientDetailsEventParameters时创建了我的新实例PatientDetailsEvent.这两个性质ValuePatientProperty也被设置.PatientProperty是一个字符串,告诉ViewModelB(即订阅者)什么属性已更改.Value是已更改的属性的新值.