猿问

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

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


打开一个用户控件作为窗口/对话框: MainWindow >> Button >> Command via MainWindowViewModel >> Show usercontrol as window/dialog


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


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


视图模型中的主窗口按钮命令:


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



    }

关闭用户控件的用户控件视图模型:


 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;



    }


慕容708150
浏览 417回答 2
2回答

30秒到达战场

一种方法是根本没有窗口(如果它不是主窗口),如这里接受的答案中使用 MVVM 处理 WPF 中的对话框。在您的窗口中有一个自由浮动的用户控件,并将其可见性绑定到视图模型中的布尔值。您还可以在WPF (MVVM) 中引发事件并在视图中处理它:Closing a view from Viewmodel?&nbsp;.另一种方法是使用 ViewModel messenger 或 Mediator。这需要视图中的代码隐藏,并且通常不用于视图模型和视图之间的通信。您将视图注册到中介类并侦听视图模型通过中介发送的特定“关闭”请求。如使用 MVVM Light 的 Messenger 在视图模型之间传递值另外,如果您实际上是在尝试关闭主窗口,为什么不使用Application.Current.Shutdown()?

潇潇雨雨

对于窗口管理,您始终可以使用 nuget 包“MvvmDialogs”,它是专门为帮助您处理窗口父子关系而设计的,并且具有相当大的示例应用程序集合。
随时随地看视频慕课网APP
我要回答