【问题标题】:Passing multiple parameters to Prism's EventAggregator将多个参数传递给 Prism 的 EventAggregator
【发布时间】:2012-03-25 14:55:32
【问题描述】:

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

ViewModelA 使用 FirstName 的新值作为有效负载发布事件:

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

ViewModelB 订阅了该事件并相应地更改其 FirstName 属性:

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

    public void UpdateBanner(string firstName)
    {
        this.FirstName = firstName;
    }

这适用于单个属性。它不适用于多个不同的属性,因为 ViewModelB 不知道 ViewModelA 上的哪些属性发生了变化。 ViewModelB 知道新值是什么,但它不知道要更新它的哪些属性。

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

【问题讨论】:

  • 好的,我在this post 中找到了我的问题的答案。我会在 8 小时后发布我的问题的具体答案。

标签: wpf mvvm prism eventaggregator


【解决方案1】:

抱歉,我在this post 中找到了我的问题的答案。 This blog post 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; }
}

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

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

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

您可以在这里看到我的PatientDetailsEventParameters 的一个新实例是在PatientDetailsEvent 发布时创建的。还设置了ValuePatientProperty 这两个属性。 PatientProperty 是一个字符串,它告诉 ViewModelB(即订阅者)哪些属性发生了变化。 Value 是已更改属性的新值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-28
    • 2016-07-18
    • 2013-01-07
    • 2011-10-10
    • 2013-09-15
    • 2010-10-09
    • 2012-09-05
    • 2017-06-14
    相关资源
    最近更新 更多