【发布时间】:2017-07-06 07:12:35
【问题描述】:
我正在开发一个项目,该项目根据用户的角色向用户显示不同的主窗口。共有三个角色:学生、培训师和管理员。尽管每个角色的主窗口不同,但我希望能够在用户注销时调用 MainWindow.close(),而不考虑 MainWindow 的子类型。
当我尝试将 MainWindow 类的子类型(如 AdminMainWindow)分配给作为超级类型 MainWindow 键入的 mainWindow 变量时,我在 switch 语句中遇到了麻烦。
请告诉我如何设置我的类层次结构来完成这项工作。
namespace MVVM
{
public partial class App : Application
{
LoginWindowViewModel loginWindowViewModel
LoginWindow loginWindow;
MainWindowViewModel mainWindowViewModel
MainWindow mainWindow;
protected override void OnStartup(StartupEventArgs e)
{
setUpNewLoginWindow();
}
void setUpNewLoginWindow()
{
loginWindowViewModel = new LoginWindowViewModel();
loginWindowViewModel.UserIsAuthenticated += new EventHandler<LoginSuccessfulEventArgs>(loginWindowViewModel_UserIsAuthenticated);
loginWindow = new LoginWindow(loginWindowViewModel);
loginWindow.Show();
}
void loginWindowViewModel_UserIsAuthenticated(object sender, LoginSuccessfulEventArgs e)
{
User authenticatedUser = e.AuthenticatedUser;
switch (authenticatedUser.Role)
{
case "A":
mainWindowViewModel = new AdminMainWindowViewModel(authenticatedUser);
mainWindow = new AdminMainWindow(adminMainWindowViewModel);
break;
case "S":
mainWindowViewModel = new StudentMainWindowViewModel(authenticatedUser);
mainWindow = new StudentMainWindow(studentMainWindowViewModel);
break;
case "T":
mainWindowViewModel = new TrainerMainWindowViewModel(authenticatedUser);
mainWindow = new TrainerMainWindow(trainerMainWindowViewModel);
break;
default:
System.Diagnostics.Debug.WriteLine("This user does not have a role assigned.");
break;
}
mainWindow.Show();
mainWindowViewModel.UserIsNotAuthenticated += new EventHandler(mainWindowViewModel_UserIsNotAuthenticated);
loginWindowViewModel = null;
loginWindow.Close();
}
void mainWindowViewModel_UserIsNotAuthenticated(object sender, EventArgs e)
{
setUpNewLoginWindow();
mainWindowViewModel = null;
mainWindow.Close();
}
}
}
****评论解决方案****
我试图做的是创建特定于用户登录角色的 Windows 和 ViewModel,但是一旦我构建了这些对象,我想对它们一视同仁,这样我就可以拥有 App 类听他们的“用户是未经身份验证的事件”并关闭窗口 - 无论我碰巧在应用程序的任何特定实例中创建的 ViewModel 和 Window 的类型。谢谢,康奈尔。
**** 修改后的代码 ****
using System;
using System.Windows;
using MVVM.Model;
using MVVM.Utility;
using MVVM.View.MainWindowsByRole;
using MVVM.ViewModel;
namespace MVVM
{
public partial class App : Application
{
LoginWindowViewModel loginWindowViewModel;
LoginWindow loginWindow;
MainWindowViewModel mainWindowViewModel;
Window mainWindow;
protected override void OnStartup(StartupEventArgs e)
{
setUpNewLoginWindow();
}
void setUpNewLoginWindow()
{
loginWindowViewModel = new LoginWindowViewModel();
loginWindowViewModel.UserIsAuthenticated += new EventHandler<LoginSuccessfulEventArgs>(loginWindowViewModel_UserIsAuthenticated);
loginWindow = new LoginWindow(loginWindowViewModel);
loginWindow.Show();
}
void loginWindowViewModel_UserIsAuthenticated(object sender, LoginSuccessfulEventArgs e)
{
User authenticatedUser = e.AuthenticatedUser;
switch (authenticatedUser.Role)
{
case "A":
AdminMainWindowViewModel adminVM = new AdminMainWindowViewModel(authenticatedUser);
AdminMainWindow adminWindow = new AdminMainWindow(adminVM);
adminWindow.Show();
mainWindowViewModel = adminVM;
mainWindow = adminWindow;
break;
case "S":
StudentMainWindowViewModel studentVM = new StudentMainWindowViewModel(authenticatedUser);
StudentMainWindow studentWindow = new StudentMainWindow(studentVM);
studentWindow.Show();
mainWindowViewModel = studentVM;
mainWindow = studentWindow;
break;
case "T":
TrainerMainWindowViewModel trainerVM = new TrainerMainWindowViewModel(authenticatedUser);
TrainerMainWindow trainerWindow = new TrainerMainWindow(trainerVM);
trainerWindow.Show();
mainWindowViewModel = trainerVM;
mainWindow = trainerWindow;
break;
default:
System.Diagnostics.Debug.WriteLine("This user does not have a role assigned.");
break;
}
mainWindowViewModel.UserIsNotAuthenticated += new EventHandler(mainWindowViewModel_UserIsNotAuthenticated);
loginWindowViewModel = null;
loginWindow.Close();
}
void mainWindowViewModel_UserIsNotAuthenticated(object sender, EventArgs e)
{
setUpNewLoginWindow();
mainWindowViewModel = null;
mainWindow.Close();
}
}
}
【问题讨论】:
-
您到底在哪里遇到问题?鉴于代码看起来您只在用户通过身份验证时分配
mainWindow? -
在 switch 语句中使用 case 'A' - 当我构造一个新的 AdminMainWindow 并将其分配给 mainWindow 变量时出现错误。我得到的错误是编译器无法将 AdminMainWindow 对象隐式转换为 MainWindow 对象。 AdminMainWindow 继承自 MainWindow。也许我应该将我正在创建的 AdminMainWindow 对象转换为 MainWindow 对象,以便我可以将它存储在变量中?但我想也许我不需要这样做,因为继承。我确定这是我不明白的。
标签: c# inheritance mvvm types