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