关闭多个模态视图时确保正确返回

时间:2015-08-31 20:06:31

标签: wpf mvvm modal-dialog

今天我遇到了一些类似下面的代码。 它非常简化,希望您可以阅读错误。

用于打开新视图的ViewHelper类。

public void DisplayView(ViewBase viewModel)
{
    view = GetView(viewModel);
    view.Owner = GetOwner(view);
    view.ShowDialog(); //Will never return if view.Owner closes itself before view.
}

查看能够打开另一个对话框的模型类。

public class MyViewModel : ViewModelBase
{
    private Action<int> _callback;
    public int SelectedInt { get; set; }

    public MyViewModel(Action<int> callback)
    {
        _callback = callback;
    }

    public void AcceptAndClose()
    {
        _callback.Invoke(SelectedInt);
        Close();
    }

    public void Close()
    {
        // Closes corresponding View
    }

    public void NewDialog()
    {
        var callback = p => 
        {
            this.SelectedInt = p;
            this.AcceptAndClose();
        }
        ViewHelper.DisplayView(new MyViewModel(callback));
    }
}

我发现它的问题是,如果我们在MyViewModel类中使用NewDialog()打开一个新的Dialog,并且新的viewmodel运行AcceptAndClose(),它将永远不会正确关闭,因为它的所有者通过回调关闭自己它可以做到。

可以通过更改AcceptAndClose()函数来解决此问题,以便在调用回调之前将其自行关闭。但它似乎很容易出错。 避免这种情况发生的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

相信我,当我说这条道路确定未来失败时。 您的viewmodel应该永远不了解视图。

您的视图应调用viewmodel。

它也解决了你的问题;)