6

モジュールの ViewModel 間の疎結合通信に Prism の EventAggregator を使用しています。ViewModelAにいくつかのプロパティ (FirstName、LastName など) があり、値が変更されたときにViewModelBのプロパティを更新する必要があります。私の現在の解決策は次のとおりです。

ViewModelAは、FirstName の新しい値をペイロードとしてイベントを発行します。

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

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;
    }

これは、単一のプロパティに対して正常に機能します。ViewModelBはViewModelAで変更されたプロパティがわからないため、複数の異なるプロパティでは機能しません。ViewModelB は新しい値が何であるかを認識していますが、どのプロパティを更新するかは認識していません。

プロパティごとに個別のイベントを作成できますが、これは繰り返しのようです。Event を 1 つだけ使用する方がきれいに見えます。理想的には、イベントを発行するときに、ViewModelA が ViewModelB に変更されたプロパティを通知する必要があります。これどうやってするの?

4

1 に答える 1

9

申し訳ありませんが、この投稿で私の質問に対する答えを見つけました。Rachel Lim によるこのブログ投稿も役に立ちます。

必要なのは、ViewModelA (パブリッシャー) がViewModelB (サブスクライバー) に次の 2 つの情報を伝えることです。

  1. ViewModelAで変更されたプロパティ
  2. このプロパティの新しい値は何ですか

2 つの情報 (つまり、プロパティ) を通信する必要がありますが、Prism の EventAggregator はpayload. これが問題です。

EventAggregator を介して複数の情報 (プロパティ) を渡すには、これらのプロパティを EventAggregator の として定義するクラスのインスタンスを公開しますpayload。このクラスを呼び出し、PatientDetailsEventParameters2 つのプロパティを定義します。

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"});
        }
    }

が発行されると、 my の新しいインスタンスPatientDetailsEventParametersが作成されることがわかります。PatientDetailsEvent2 つのプロパティValuePatientPropertyも設定されます。ViewModelB (つまりサブスクライバー) にどのプロパティが変更されたかPatientPropertyを伝える文字列です。変更されたプロパティの新しい値です。Value

于 2012-03-08T11:05:20.090 に答える