0

我有一个应用程序,我在另一个视图模型中打开一个新视图(使用视图模型)。新的 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; }
}

这座建筑的用途是:

消息的接收者视图模型必须添加

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来防止任何内存泄漏。请参阅此处此处的教程。

您也可以将Event Aggregator 与 Reactive Extensions 一起使用。

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

于 2013-07-21T12:10:30.740 回答