我正在尝试从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();
}
答案 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'它专门用于帮助您处理窗口父子关系,并且具有相当大的示例应用程序集合。