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

时间:2018-05-24 20:59:52

标签: c# wpf xaml mvvm

我正在尝试从viewmodel关闭一个用户控件,该视图模型在viewmodel按钮命令中作为窗口/对话框打开。

以窗口/对话框打开usercontrol: MainWindow>>按钮>>通过MainWindowViewModel命令>>将usercontrol显示为窗口/对话框

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

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

viewmodel中的

mainwindow按钮命令:

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AuthService } from '../_services/auth.service';

@Injectable({
  providedIn: 'root'
})
export class AuthGuardService implements CanActivate {

  constructor(
    private router: Router,
  ) { }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
    if(localStorage.getItem('currentUser')){
      return true;
    }
    this.router.navigate(['/login'], { queryParams: { returnUrl : state.url }});
    return false;
  }
}

usercontrol viewmodel关闭usercontrol:

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


    }

2 个答案:

答案 0 :(得分:0)

一种方法是根本没有窗口(如果它不是主窗口),就像在此处接受的答案Handling Dialogs in WPF with MVVM一样。在窗口中有一个自由浮动的用户控件,并将其可见性绑定到视图模型中的布尔值。

您还可以在视图中引发事件并将其处理为WPF (MVVM): Closing a view from Viewmodel?

另一种方法是使用ViewModel messenger或Mediator。这需要视图中的代码隐藏,并且通常不用于视图模型和视图之间的通信。您将视图注册到mediator类并侦听该特定的" close"视图模型通过调解器发送的请求。与Use MVVM Light's Messenger to Pass Values Between View Model

中一样

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

答案 1 :(得分:0)

对于窗口管理,您始终可以使用nuget包' MvvmDialogs'它专门用于帮助您处理窗口父子关系,并且具有相当大的示例应用程序集合。