C# 在登录和仪表板页面之间导航

C# 在登录和仪表板页面之间导航,c#,wpf,mvvm,C#,Wpf,Mvvm,我是WPF的新手。我正在使用WPF MVVM模式作为前端开发来创建一个POS桌面应用程序。(我已尽力使这个问题尽可能简短。) 场景:我有一个MainViewModel,当用户打开应用程序时,默认情况下会显示AuthView(和AuthViewModel)。用户填写表单并单击AuthView中的登录按钮后,将在视图上调用LoginCommand,如果登录成功,它们将重定向到仪表板视图 main window.xaml MainViewModel.cs public类MainViewModel:

我是WPF的新手。我正在使用WPF MVVM模式作为前端开发来创建一个POS桌面应用程序。(我已尽力使这个问题尽可能简短。)

场景:我有一个
MainViewModel
,当用户打开应用程序时,默认情况下会显示
AuthView
(和AuthViewModel)。用户填写表单并单击
AuthView
中的登录按钮后,将在视图上调用
LoginCommand
,如果登录成功,它们将重定向到
仪表板视图

main window.xaml


MainViewModel.cs

public类MainViewModel:ViewModelBase
{
公共主视图模型()
{
如果(SelectedViewModel==null)
{
SelectedViewModel=新建AuthViewModel();
}
其他的
{
SelectedViewModel=新仪表板ViewModel();
}
}
私有视图模型库_选择的视图模型;
公共视图模型库选择的视图模型
{
获取{return\u selectedViewModel;}
设置{u selectedViewModel=value;OnPropertyChanged(nameof(selectedViewModel));}
}
公共作废更改为仪表板()
{
SelectedViewModel=新仪表板ViewModel();
}
}
AuthViewModel.cs

公共类AuthViewModel:ViewModelBase { 公共AuthViewModel() { loginCommand=新的RelayCommand(登录); } #区域登录 私人继电器命令; 公共中继命令登录命令 { 获取{return loginCommand;} } 私有异步void登录() { 尝试 { Response=wait callLoginAPI;//此处出现一些自定义登录 如果(Response.Status==“ok”) { //将viewModel更改为仪表板viewModel屏幕 MainViewModel MainViewModel=新的MainViewModel(); MainViewModel.ChangeToDashboard(); } } 捕获(例外e) { // } } #端区 } 问题:我经历了很多SA解决方案,但在用户成功登录后仍然无法切换视图


问题:在更改
SelectedViewModel
属性后(用户成功登录后,response.status==ok),如何触发MainViewModel更改UI?或者有没有其他更好(尽可能简单)的方法来实现我的目标?

AuthViewModel可以生成关于登录的事件

public class AuthViewModel : ViewModelBase
{
    public AuthViewModel()
    {
        loginCommand = new RelayCommand(Login);   
    }

    public event EventHandler LoginCompleted;

    protected virtual void OnLoginCompleted(EventArgs e)
    {
        EventHandler handler = LoginCompleted;
        handler?.Invoke(this, e);
    }

    private RelayCommand loginCommand;
    public RelayCommand LoginCommand
    {
        get { return loginCommand; }
    }
    private async void Login()
    {
        try
        {
            Response = await callLoginAPI(); //some custom login occurs here

            if (Response.Status == "ok")
            {
                OnLoginCompleted(EventArgs.Empty);
            }
        }
        catch (Exception e)
        {
            //
        }
    }
}
MainViewModel可以处理该事件:

public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {
        if (SelectedViewModel == null)
        {
            var vm = new AuthViewModel();
            vm.LoginCompleted += (sender, e) => ChangeToDashboard();
            SelectedViewModel = vm;
        }
        else
        {
            SelectedViewModel = new DashboardViewModel();
        }
    }

    private ViewModelBase _selectedViewModel;
    public ViewModelBase SelectedViewModel
    {
        get { return _selectedViewModel; }
        set { _selectedViewModel = value; OnPropertyChanged(nameof(SelectedViewModel)); }
    }

    private void ChangeToDashboard()
    {
        SelectedViewModel = new DashboardViewModel();
    }
}