C#类型麻烦 - WPF控制主窗口



我正在研究一个项目,该项目根据用户的角色为用户提供了不同的主窗口。有三个角色:学生,培训师和管理员。即使每个角色的主窗口都会有所不同,我希望能够在用户注销时,无论MainWindow的子类型如何。

。当我尝试将MainWindow类(例如AdminMainWindow)的子类型分配给我的MainWindow变量时,

我遇到了麻烦,当时我的MainWindow类(例如AdminMainWindow)遇到了麻烦。

请让我知道我如何设置课程层次结构以使这项工作。

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

****关于解决方案的评论****

我要做的是创建特定于用户登录角色的窗口和查看模型,但是一旦我构造了这些对象,我就想将它们全部处理在一起,以便我可以拥有应用程序类别聆听他们的"用户是未经身份验证的事件",然后关闭窗口 - 无论我在应用程序的任何特定实例中创建的ViewModel和窗口的类型如何。谢谢,康奈尔。

****修订的代码****

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

case "S":
    mainWindowViewModel = new StudentMainWindowViewModel(authenticatedUser);
    mainWindow = new StudentMainWindow(studentMainWindowViewModel);
    break;

执行从StudentMainWindowViewModel到MainWindowViewModel的隐式扩大转换。问题在于,您然后尝试将隐式铸件用于下一行的缩小转换。StudentMainWindow构造函数期望学生MainWindowViewModel,但您通过MainWindowViewModel。

请参阅此文档以获取更好的解释。

https://msdn.microsoft.com/en-us/library/k1e94s7e(v = vs.140).aspx

这也将是有益的。

在类型之间转换

您可以通过这样修改代码来摆脱它:

switch (authenticatedUser.Role)
        {
            case "A":
                AdminMainWindowViewModel adminVM = new AdminMainWindowViewModel(authenticatedUser);
                mainWindowViewModel = adminVM;
                mainWindow = new AdminMainWindow(adminVM);
                break;
            case "S":
                StudentMainWindowViewModel studentVM = new StudentMainWindowViewModel(authenticatedUser);
                mainWindowViewModel = studentVM;
                mainWindow = new StudentMainWindow(studentVM);
                break;
            case "T":
                TrainerMainWindowViewModel trainerVM = new TrainerMainWindowViewModel(authenticatedUser);
                mainWindowViewModel = trainerVM;
                mainWindow = new TrainerMainWindow(trainerVM);
                break;
            default:
                System.Diagnostics.Debug.WriteLine("This user does not have a role assigned.");
                break;
        }

另外,您可以使用明确的铸件:

case "A":
    mainWindowViewModel = new AdminMainWindowViewModel(authenticatedUser);
    mainWindow = new AdminMainWindow((AdminMainWindowViewModel)mainWindowViewModel);
    break;

最新更新