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;
}
}
}
这很好用。我的问题是:这是视图模型之间交流的好方法吗?还是这个设计中有任何弱点?
当轮子已经存在时,您不需要重新发明轮子。
使用EventAggregator,它在内部使用弱事件模式来防止任何内存泄漏。请参阅此处和此处的教程。
此外,您还可以将事件聚合器与反应式扩展一起使用。
请参阅文章,了解可以重用的可行方法——甚至聚合器实现示例/最佳实践。