我从MainWindowViewModel启动了一个包含UserControl的窗口,我想关闭该窗口

时间:2019-02-06 23:09:49

标签: wpf mvvm

我正在启动一个包含UserControl的窗口,我想从UserControl的ViewModel中关闭该窗口。坚持使用MVVM的最佳方式是什么?

理想情况下,我想在关闭窗口时使用IsCancel调用与Button相同的命令。我没有与取消按钮绑定的代码,它可以完美关闭窗口。

这就是我目前正在做的...

我从MainWindowViewModel使用UserControl启动窗口,然后将MainWindowViewModel传递给UserControl的ViewModel,如下所示:

        Window window = new Window
        {
            Title = "Sign In",
            Height = 350,
            Width = 500,
            WindowStartupLocation = WindowStartupLocation.CenterScreen,
            WindowStyle = WindowStyle.ToolWindow,
            ResizeMode = ResizeMode.NoResize,
            Content = new SignIn(mainWindowViewModel: this)
        };

        window.ShowDialog();

我只是不太确定如何从UserControl的ViewModel中关闭窗口。

1 个答案:

答案 0 :(得分:0)

在此处填充很多空白,但假设“ SignIn”是您的视图模型,则可以传递一个Action /回调,您的SignIn视图模型可以调用该操作/回调来关闭窗口:

Window window = new Window
{
    Title = "Sign In",
    Height = 350,
    Width = 500,
    WindowStartupLocation = WindowStartupLocation.CenterScreen,
    WindowStyle = WindowStyle.ToolWindow,
    ResizeMode = ResizeMode.NoResize,
};

window.Content = new SignIn(mainWindowViewModel: this, 
    closeWindowAction: (isCancelled) =>
    {
        window.DialogResult = !isCancelled;
        window.Close();
    });

window.ShowDialog();

因此您可以在视图模型之间保持某种程度的松散耦合,并假设SignIn VM类看起来像这样:

public class SignIn
{
    private readonly Action<bool> _closeWindowAction;

    public SignIn(MainWindowViewModel mainWindowViewModel, Action<bool> closeWindowAction)
    {
        _closeWindowAction = closeWindowAction;
    }

    public void CloseWindow(bool isCancelled)
    {
        _closeWindowAction.Invoke(isCancelled);
    }
}

尽管如此,我不清楚您为什么将MainWindowViewModel传递到SignIn视图模型中。

如果您想在MVVM方面保持真正的整洁,那么我倾向于创建一个IDialogService接口,该接口可用于在我的视图模型中显示消息框,模态等-委托创建和管理Window中该服务的某些实现。最终结果是视图模型不知道如何显示模式或对话框。

如果您有兴趣-可以使用诸如https://github.com/FantasticFiasco/mvvm-dialogs之类的库,也可以自己滚动。