c# - Prism WPF 关闭视图并处理自动装配的 ViewModel
问题描述
简而言之,我想要完成的行为是 LOGIN->LOGOUT->LOGIN
我的应用程序以登录视图开始。身份验证后,它关闭并打开 MainView:
public void Authenticated(){
MainWindow main = new MainWindow();
main.Show();
if (Application.Current.Windows.Count > 1) {
Application.Current.Windows[0].Close();
}
this.CloseAction();
}
CloseAction 只是一个动作变量,它像这样从代码隐藏中关闭
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
if ( (this.DataContext as MainWindowViewModel)!.CloseAction == null )
(this.DataContext as MainWindowViewModel)!.CloseAction = new Action(this.CloseH);
}
private void CloseH() {
this.Close();
}
}
我的主要内容还包含从 MainViewViewModel 的逻辑推送的两个视图区域(这两个是 USERCONTROLS)
_regionManager.RegisterViewWithRegion("FileTreeRegion", typeof(FileTree));
_regionManager.RegisterViewWithRegion("FileDetailsRegion", typeof(FileDetails));
在某些时候,如果我需要注销,我会运行该功能
public void Logout(){
Login login = new Login();
login.Show();
if (Application.Current.Windows.Count > 1) {
Application.Current.Windows[0].Close();
}
this.CloseAction();
// _eventAggregator.GetEvent<AppMessageLogout>().Publish();
// _regionManager.Regions.ToList().ForEach((r) => r.RemoveAll());
}
但是当我重试登录时,我的视图视图模型(用户控件 FileTree 和 FileDetails)被调用了两次(调试构造函数方法)。先前评论的行是两次尝试解决该问题但没有成功:
- 在 UserControl 中使用带有 Disposable 的发布/订阅命令(我只在视图模型中处理了注册命令,因为
Close()
在 UserControl 中没有 a) - 丢弃 regionManager 中的所有视图以避免垃圾收集。Altought我想这是没用的,因为正如我在网上阅读的那样,视图的父窗口是主窗口,当它关闭时,视图也会
ViewModel 都在 xaml 文件中使用 Prism 自动装配。
解决方案
推荐阅读
- python-3.x - 使用 Qtablewidget 检索已编辑的数据
- javascript - 检查电子邮件是否在自定义快速验证器的数据库中。(节点,快递,mysql)
- reactjs - Nodemailer/Express 不使用 Formik 发布
- c - 循环遍历C中的数组
- c# - why is Read7BitEncodedInt(); in BinaryReader protected?
- django - django 如何在同一编辑帖子上创建帖子后重定向 url
- c# - What should be the scope of AmazonS3Client object in a web application?
- javascript - 使用Javascript动态移动元素位置
- python - 查找图像中颜色方块的轮廓和中点
- android - 在 activity_main.xml 的新 kotlin 项目中不允许使用属性 android:id