如何使用mvvm-light Messenger接收DialogResult

时间:2011-06-22 13:16:40

标签: wpf mvvm-light

我正在尝试使用 mvvm-light messenger功能在我的视图中打开自定义确认密码对话框,由我的viewmodel中的命令触发。

我想我理解Messenger.Default.RegisterMessenger.Default.Send的用法。

但如何在视图模型中返回对话框结果?

对我而言,发送似乎是一条单行道......

有人可以帮助初学者使用小型C#/ WPF代码示例吗?

感谢您的帮助

3 个答案:

答案 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);