【问题标题】:I launched a Window containing a UserControl from my MainWindowViewModel and I want to close that Window我从 MainWindowViewModel 启动了一个包含 UserControl 的窗口,我想关闭该窗口
【发布时间】:2019-02-06 23:09:49
【问题描述】:

我正在启动一个包含 UserControl 的窗口,并且我想从 UserControl 的 ViewModel 中关闭该窗口。在坚持使用 MVVM 的同时,最好和最干净的方法是什么?

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

这是我目前正在做的事情......

我使用 MainWindowViewModel 中的 UserControl 启动 Window,然后将 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 关闭窗口。

【问题讨论】:

  • 对此有什么好处吗?如果我下面的回答没有帮助,那么您要详细说明吗?
  • @olitee 我实际上在 MainWindowViewModel 中创建了一个名为 ChildWindow 的属性,并将我启动的窗口设置为该属性。然后,因为我可以从新窗口访问 MainWindowViewModel,所以我可以调用 MainWindowViewModel.ChildWindow.Close() 并关闭任何打开的窗口。

标签: wpf mvvm


【解决方案1】:

在这里填写很多空白,但假设“登录”是您的视图模型,您可以传递一个操作/回调,您的登录视图模型可以调用该操作/回调来关闭窗口:

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);
    }
}

不过,我不是 100% 清楚您为什么将 MainWindowViewModel 传递到您的 SignIn 视图模型中。

如果你想在 MVVM 方面保持干净,那么我倾向于创建一个 IDialogService 界面,我可以使用它在我的视图模型中显示消息框、模式等 - 它委托创建和管理Window 该服务的某些实现。最终结果是视图模型不知道模式或对话框将如何显示。

如果您有兴趣 - 您可以使用诸如 https://github.com/FantasticFiasco/mvvm-dialogs 之类的库 - 或自行开发。

【讨论】:

  • 作为引用库的作者,如果您觉得我们缺少关于如何使用 MvvmDialogs 解决您的特定用例的示例,只需创建一个问题,我们会解决它。
猜你喜欢
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多