从对话框窗口回调到主窗口

4
我正在开发一个使用MVVMLightToolkit作为第三方帮助的WPF MVVM应用程序。我的场景如下:
我有一个主窗口,当关闭主窗口时,我必须显示一个新的对话框窗口(保存更改对话框窗口),以确认用户是否需要将他在应用程序中所做的更改保存到状态文件中或者不保存。我该如何在MVVM中处理这种情况?通常,为了显示一个新窗口,我使用MVVMLight Messenger类。在这种情况下,我从Main Window代码后台打开Save Changes Dialog窗口。我需要根据Save Changes Dialog Window中选择的用户选项(SAVE、SAVE/EXIT、CANCEL)回调Main View Model,并根据此来检查是否需要关闭主窗口。最佳的MVVM方法是什么?
2个回答

1

只需在视图模型和视图之间传递消息。

视图:

private void Window_Closing(object sender, CancelEventArgs e)
{
    Messenger.Default.Send(new WindowRequestsClosingMessage(
        this, 
        null,
        result => 
        { 
            if (!result)
                e.Cancel = true;
        });
}

ViewModel:

Messenger.Default.Register<WindowRequestsClosingMessage>(
    this,
    msg => 
    {

        // Your logic before close

        if (CanClose)
            msg.Execute(true);
        else
            msg.Execute(false);
    });

信息:

public class WindowRequestsClosingMessage: NotificationMessageAction<bool>
{
    public WindowRequestsClosingMessage(string notification, Action<bool> callback)
        : base(notification, callback)
    {
    }

    public WindowRequestsClosingMessage(object sender, string notification, Action<bool> callback)
        : base(sender, notification, callback)
    {
    }

    public WindowRequestsClosingMessage(object sender, object target, string notification, Action<bool> callback)
        : base(sender, target, notification, callback)
    {
    }
}

MVVM Light的NotificationMessageAction<TResult>允许您传递消息并获取TResult类型的结果。要将TResult传回请求者,请像示例一样调用Execute()

0
为什么不在你的关闭事件中做类似以下的事情:
    private void Window_Closing(object sender, CancelEventArgs e)
    {
        SaveDialog sd = new SaveDialog();
        if (sd.ShowDialog() == false)
        {
            e.Cancel = true;
        }
    }

SaveDialog.ShowDialog() 返回一个可空的布尔值。我的应用程序是一个 WPF 应用程序,而不是 Windows。 - Dennis Jose
所以,将 SaveDialogResults.Cancel 更改为 true、false 或 null,任何你想要的都可以^^ - Florian Gl
谢谢回复。实际上,Window_Closing 命令是使用 RelayCommand 从 ViewModel 处理的。通过使用 Messenger(MVVMLight),我在主窗口代码后台从该命令处理程序中显示 SaveChanges 对话框窗口。我需要一个回调到主视图模型命令处理程序,并传递保存对话框窗口中选择的选项。希望现在您明白我的情况了。 - Dennis Jose
好的。我对MVVMLight不太熟悉,但是你不能只是通过Messenger向你的ViewModel发送消息吗,例如 Messenger.Send<bool?, ViewModel>(SaveDialog.ShowDialog()); ,然后通过 Messenger.Register<bool?>(this, delegate(bool? result) { }); 进行注册。 - Florian Gl
我需要一个回调到主窗口关闭命令处理程序方法,以便我可以保存状态。如果按照您的建议从视图发送消息到视图模型,我没有收到该方法的回调。 - Dennis Jose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接