我试图使用mvvm-light信使功能在我的视图中打开一个自定义确认密码对话框,该对话框由视图模型中的命令触发。
我想我理解Messenger.Default.Register和Messenger.Default.Send的用法。
,但是如何在视图模型中返回对话框结果呢?
在我看来,发送似乎是一条单行道.
有人能帮助初学者使用一个小的C#/WPF代码示例吗?
谢谢你的帮助
发布于 2011-06-22 15:00:46
使用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);
}
});我认为这种方法更简洁,因为它不会产生从视图到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);
});变得更清楚了。
而且非常重要的注销了接收方,否则可能会造成内存泄漏。
发布于 2011-06-22 13:52:26
在Register中,您可以显示一个对话框并传递YourViewModel引用。
Messenger.Default.Register<YourViewModel>(this, "showDialog", viewModel=>
{
var dlg = new Dialog();
viewModel.Result = dlg.ShowDialog();
});在代码中的某个地方,您可以抛出带有对YourViewModel的引用的Send()消息,如下所示:
Messenger.Default.Send(viewModel, "showDialog");发布于 2013-12-10 12:14:23
为了按照标题所示使用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);
}注意接收方最后一行中回调方法的显式调用。
msg.Callback(result);https://stackoverflow.com/questions/6440492
复制相似问题