ViewModels之间通过事件进行通信

本文关键字:通信 事件 之间 ViewModels | 更新日期: 2023-09-27 18:24:10

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

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

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

ViewModels之间通过事件进行通信

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

使用EventAggregator,它在内部使用弱事件模式来防止任何内存泄漏。请参阅此处和此处的教程。

此外,您还可以将事件聚合器与反应式扩展一起使用。

请参阅文章,了解可以重用的可行方法——甚至聚合器实现示例/最佳实践。