0

別のビューモデル内で (ビューモデルを使用して) 新しいビューを開くアプリケーションがあります。新しいビューモデルには、呼び出し元のビューモデルからのいくつかのパラメーターが必要です。

ここで、Messenger というクラスを導入しました。これは次のようになります。

public class Messenger
    {
        private static Messenger instance;
        public static Messenger Instance
        {
            get { return instance ?? (instance = new Messenger()); }
        }

        private Messenger() { }

        public void SendMessage(Message message)
        {
            OnMessageSent temp = MessageSent;
            if (temp != null)
                temp(message);
        }

        public delegate void OnMessageSent(Message message);
        public event OnMessageSent MessageSent;
    }

メッセージクラスは次のようになります。

public class Message
{
    public Type TargetType { get; set; }
    public object Sender { get; set; }
    public Type ValueType { get; set; }
    public object Value { get; set; }
    public string AdditionalInfo { get; set; }
}

この建物の用途は次のとおりです。

メッセージの受信者ビューモデルは追加する必要があります

Messenger.Instance.MessageSent += MessageSent;

そのコンストラクタに。そして、実装では次のようになります。

 private void MessageSent(Message message)
 {
    if(message.TargetType == typeof(SecondViewModel))
    {
       if (message.ValueType == typeof (double))
          {
             this.MyValue= (double) message.Value;
          }
     }
  }

これはうまくいきます。私の質問は次のとおりです。これはビューモデル間の通信に適した方法ですか、それともこの設計に弱点はありますか?

4

1 に答える 1

0

車輪が既にある場合、再発明する必要はありません。

内部で弱いイベント パターンを使用するEventAggregatorを使用して、メモリ リークを防ぎます。ここここのチュートリアルを参照してください。

また、Reactive Extensions で Event Aggregator を使用することもできます。

再利用できる実行可能なアプローチについては、投稿を参照してください - Even Aggregator Implementation Sample/Best Practices

于 2013-07-21T12:10:30.740 に答える