繁体   English   中英

如何从以wpf mvvm模式作为窗口打开的视图模型中关闭用户控件?

[英]How do you close a usercontrol from a viewmodel that was opened as a window in wpf mvvm pattern?

我试图从在viewmodel按钮命令中作为窗口/对话框打开的viewmodel中关闭用户控件。

以窗口/对话框的形式打开用户控件:MainWindow >>按钮>>通过MainWindowViewModel进行命令>>将用户控件显示为窗口/对话框

关闭在上一步中打开的用户控件:????

我也想知道我是否违反了mvvm模式,所以如果有人可以为我提供一些适当的示例,因为我对wpf MVVM模式还很陌生。

viewmodel中的mainwindow按钮命令:

private void ExecuteOtherMethod(object parameter)
    {


        registerWindow win = (registerWindow)Application.Current.MainWindow;
        //win.pp.IsOpen = true;
        win.bankRectangle.Visibility = Visibility.Visible;
        Window window = new Window

        {

            WindowStyle = WindowStyle.None,
            SizeToContent = SizeToContent.WidthAndHeight,
            ResizeMode = ResizeMode.NoResize,
            Content = new otherOptionsView()
        };
        window.Owner = win;
        window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
        window.ShowDialog();


    }

usercontrol viewmodel关闭用户控件:

 private void ExecuteMethod(object parameter)
    {

        //otherOptionsView newview = new otherOptionsView();
        //Window parentWindow = (Window)newview.Parent;
        //parentWindow.Close();
        var displayViews = App.Current.Windows.OfType<otherOptionsView>();
        if (displayViews.Any())
            displayViews.First().Close();
        registerWindow win = (registerWindow)Application.Current.MainWindow;
        win.bankRectangle.Visibility = Visibility.Collapsed;


    }

一种方法是根本没有任何窗口(如果不是主窗口),如此处的接受答案中所述: 使用MVVM在WPF中处理对话框 在窗口中有一个自由的浮动用户控件,并将其可见性绑定到视图模型中的布尔值。

您还可以像在WPF(MVVM)中一样引发事件并在视图中处理该事件:从Viewmodel关闭视图?

另一种方法是使用ViewModel Messenger或Mediator。 这需要在视图中隐藏代码,并且通常不用于视图模型与视图之间的通信。 您将视图注册到调解器类,并侦听视图模型通过调解器发送的特定“关闭”请求。 使用MVVM Light的Messenger一样,在视图模型之间传递值

另外,如果您实际上要关闭主窗口,为什么不使用Application.Current.Shutdown()

对于窗口管理,您始终可以使用nuget包“ MvvmDialogs”,它是专门为帮助您处理窗口父子关系而设计的,并且具有大量示例应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM