ИМХО лучше использовать 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);
});
становятся намного понятнее.
И verryважно отмените регистрацию получателя, иначе вы можете создать утечку памяти.