4

我正在开发一个 WPF MVVM 应用程序,它使用MVVMLightToolkit作为第三方助手。我的场景如下:

我有一个主窗口,在关闭主窗口时,我必须显示一个新的对话框窗口(保存更改对话框窗口)以确认用户是否必须将他在应用程序中所做的更改保存到状态文件或不是。如何在 MVVM 中处理这种情况?通常为了显示一个新窗口,我正在使用 MVVMLight Messenger类。在这种情况下,我从主窗口打开“保存更改对话框”窗口后面的代码。我需要根据从“保存更改”对话框窗口中选择的用户选项(SAVE、SAVE/EXIT、CANCEL)回调主视图模型,并基于此我必须检查是否必须关闭主窗口或不。处理这种情况的最佳 MVVM 方法是什么?

4

2 回答 2

1

只需将消息从/传递到 ViewModel。

查看

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

视图模型

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()像示例一样调用。

于 2013-02-21T09:45:41.403 回答
0

为什么不在闭幕式中执行以下操作:

    private void Window_Closing(object sender, CancelEventArgs e)
    {
        SaveDialog sd = new SaveDialog();
        if (sd.ShowDialog() == false)
        {
            e.Cancel = true;
        }
    }
于 2013-02-21T08:22:50.113 回答