我有一个应用程序,我在另一个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;
}
}
}
这很好用。我的问题是:这是视图模型之间通信的好方法还是在这个设计中有任何弱点?
答案 0 :(得分:0)
当它已经存在时,你不需要重新发明轮子。
使用内部使用EventAggregator的weak event pattern来防止任何内存泄漏。请参阅教程here和here。
您也可以使用Event Aggregator with Reactive Extensions。
请参阅帖子,了解可以重复使用的可行方法 - Even Aggregator Implementation Sample/Best Practices。