我正在尝试使用 mvvm-light messenger功能在我的视图中打开自定义确认密码对话框,由我的viewmodel中的命令触发。
我想我理解Messenger.Default.Register
和Messenger.Default.Send
的用法。
但如何在视图模型中返回对话框结果?
对我而言,发送似乎是一条单行道......
有人可以帮助初学者使用小型C#/ WPF代码示例吗?
感谢您的帮助
答案 0 :(得分:15)
恕我直言,最好使用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);
});
变得更加清晰。
非常重要取消注册收件人,否则您可能会造成内存泄漏。
答案 1 :(得分:1)
在Register方法中,您可以显示一个对话框并传递YourViewModel参考。
Messenger.Default.Register<YourViewModel>(this, "showDialog", viewModel=>
{
var dlg = new Dialog();
viewModel.Result = dlg.ShowDialog();
});
在您的代码中的某处,您可以抛出Send()消息,并引用YourViewModel,如下所示:
Messenger.Default.Send(viewModel, "showDialog");
答案 2 :(得分:0)
为了实现上述使用DialogMessage,如标题所示, 可以使用以下内容:
发件人方:
void SendMessage(String msgText)
{
DialogMessage messege = new DialogMessage(msgText, res =>
{
callback(res);
})
//set more dialog properties using the Initializer
{ Button = MessageBoxButton.OKCancel, Caption = "" };
Messenger.Default.Send(messege, "mb1");
}
public void callback(MessageBoxResult res)
{
if (res == MessageBoxResult.OK)
{ /*do something*/ }
}
接收方:
void Rec()
{
Messenger.Default.Register<DialogMessage>(
this, "mb1", msg => ShowDialog(msg));
Unloaded += Unreg;
}
void ShowDialog(DialogMessage msg)
{
var result = MessageBox.Show(
msg.Content,
msg.Caption,
msg.Button);
msg.Callback(result);
}
请注意 显式 调用接收器最后一行中的Callback方法。
msg.Callback(result);