恕我直言,最好使用NotificationMessageAction<T>,因为它是为此任务而设计的。
在发送方:
var msg = new NotificationMessageAction<MessageBoxResult>(this, "GetPassword", (r) =>
{
if (r == MessageBoxResult.OK)
{
// do stuff
}
});
Messenger.Default.Send(msg);
在接收方:
Messenger.Default.Register<NotificationMessageAction<MessageBoxResult>>(this, (m) =>
{
if (m.Notification == "GetPassword") {
var dlg = new PasswordDialog();
var result = dlg.ShowDialog();
m.Execute(result);
}
});
我相信这种方法更简洁,因为它不会创建从 View 到 ViewModel 的不必要的依赖关系(尽管这种方式并不是那么糟糕)。为了更好的可读性,请考虑对NodificationMessageAction<MessageResult> 进行子类化。即
public class ShowPasswordMessage : NotificationMessageAction<MessageBoxResult>
{
public ShowPasswordMessage(object Sender, Action<MessageBoxResult> callback)
: base(sender, "GetPassword", callback)
{
}
}
然后是发件人
var msg = new ShowPasswordMessage(this, (r) =>
{
if (r == MessageBoxResult.OK)
{
// do stuff
}
});
Messenger.Default.Send(msg);
和接收方
Messenger.Default.Register<ShowPasswordMessage>(this, (m) =>
{
var dlg = new PasswordDialog();
var result = dlg.ShowDialog();
m.Execute(result);
});
变得清晰了很多。
并且非常重要取消注册收件人,否则您可能会造成内存泄漏。