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

时间:2013-02-21 08:05:44

标签: .net wpf mvvm callback mvvm-light

我正在开发一个WPF MVVM应用程序,该应用程序使用 MVVMLightToolkit 作为第三方帮助程序。我的情节如下:

我有一个主窗口,在关闭主窗口时,我必须显示一个新的对话窗口(保存更改对话框窗口)以确认用户是否必须保存更改他在申请中提交了州档案或。如何在MVVM中处理这种情况?通常,为了显示一个新窗口,我正在使用MVVMLight Messenger 类。在这种情况下,我将从主窗口打开保存更改对话框窗口 代码隐藏。我需要根据保存更改对话框窗口中的所选用户选项(SAVE,SAVE / EXIT,CANCEL)回调主视图模型,并根据我必须检查是否必须关闭主窗口与否。处理这种情况的最佳MVVM方法是什么?

2 个答案:

答案 0 :(得分: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&lt; TResult&gt; 允许您传递消息并获得TResult类型的结果。要将TResult传递回请求者,请像示例一样调用Execute()

答案 1 :(得分:0)

为什么不在Closing-Event中执行以下操作:

    private void Window_Closing(object sender, CancelEventArgs e)
    {
        SaveDialog sd = new SaveDialog();
        if (sd.ShowDialog() == false)
        {
            e.Cancel = true;
        }
    }