ViewModels之间通过事件进行通信

时间:2013-07-21 11:11:18

标签: c# wpf mvvm

我有一个应用程序,我在另一个viewmodel中打开一个新视图(带有viewmodel)。新的Viewmodel需要来自调用者视图模型的一些参数。

现在我介绍了一个名为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; }
}

这栋楼的用途是:

消息的receiver-viewmodel必须添加

Messenger.Instance.MessageSent += MessageSent;

到它的构造函数。在实现中可以看起来像:

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

这很好用。我的问题是:这是视图模型之间通信的好方法还是在这个设计中有任何弱点?

1 个答案:

答案 0 :(得分:0)

当它已经存在时,你不需要重新发明轮子。

使用内部使用EventAggregatorweak event pattern来防止任何内存泄漏。请参阅教程herehere

您也可以使用Event Aggregator with Reactive Extensions

请参阅帖子,了解可以重复使用的可行方法 - Even Aggregator Implementation Sample/Best Practices