首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mvvm-light Messenger接收DialogResult

如何使用mvvm-light Messenger接收DialogResult
EN

Stack Overflow用户
提问于 2011-06-22 13:16:40
回答 3查看 7.4K关注 0票数 9

我试图使用mvvm-light信使功能在我的视图中打开一个自定义确认密码对话框,该对话框由视图模型中的命令触发。

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

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

在我看来,发送似乎是一条单行道.

有人能帮助初学者使用一个小的C#/WPF代码示例吗?

谢谢你的帮助

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-22 15:00:46

使用NotificationMessageAction<T>更好,因为它是为这项任务而设计的。

在发送方:

代码语言:javascript
复制
var msg = new NotificationMessageAction<MessageBoxResult>(this, "GetPassword", (r) =>
{
    if (r == MessageBoxResult.OK)
    {
        // do stuff
    }
});

Messenger.Default.Send(msg);

在接收方:

代码语言:javascript
复制
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>进行子类化。也就是说。

代码语言:javascript
复制
public class ShowPasswordMessage : NotificationMessageAction<MessageBoxResult>
{
    public ShowPasswordMessage(object Sender, Action<MessageBoxResult> callback)
        : base(sender, "GetPassword", callback)
    {

    }
}

然后发件人

代码语言:javascript
复制
var msg = new ShowPasswordMessage(this, (r) =>
{
    if (r == MessageBoxResult.OK)
    {
        // do stuff
    }
});

Messenger.Default.Send(msg);

和接收端

代码语言:javascript
复制
Messenger.Default.Register<ShowPasswordMessage>(this, (m) =>
{
    var dlg = new PasswordDialog();
    var result = dlg.ShowDialog();
    m.Execute(result);
});

变得更清楚了。

而且非常重要的注销了接收方,否则可能会造成内存泄漏。

票数 18
EN

Stack Overflow用户

发布于 2011-06-22 13:52:26

在Register中,您可以显示一个对话框并传递YourViewModel引用。

代码语言:javascript
复制
 Messenger.Default.Register<YourViewModel>(this, "showDialog", viewModel=>
         {
           var dlg = new Dialog();         
           viewModel.Result = dlg.ShowDialog();                                                  
         });

在代码中的某个地方,您可以抛出带有对YourViewModel的引用的Send()消息,如下所示:

代码语言:javascript
复制
Messenger.Default.Send(viewModel, "showDialog");
票数 1
EN

Stack Overflow用户

发布于 2013-12-10 12:14:23

为了按照标题所示使用DialogMessage实现上述目的,可以使用以下方法:

发送方:

代码语言:javascript
复制
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*/ }
}

接收端:

代码语言:javascript
复制
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);
}

注意接收方最后一行中回调方法的显式调用。

代码语言:javascript
复制
msg.Callback(result);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6440492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档