WPF切换视图使用MVVM模式没有导航视图
本文关键字:视图 模式 导航 MVVM WPF | 更新日期: 2023-09-27 18:05:23
我正在使用MVVM模式构建我的第一个WPF应用程序。
应用程序以login View开始,其中包含一个login按钮。
当我单击登录按钮时,它执行ICommand在LoginViewModel中,如果登录成功,则从服务器获得响应。
(我正在用用户凭据构建基于WCF和WPF的聊天)
*我想实现的是:如果登录成功,它将切换到SignUp视图
(我知道这没有任何意义,但这只是为了测试视图切换)
到目前为止,我一直在阅读关于导航通过按钮。如你所知,那不是我的目的。所有我想要的是验证用户,然后,加载聊天视图(我还没有,所以这就是为什么我提到没有任何意义的注册视图)
我有一个主窗口和Xaml代码,其中只包含内容控制在一个网格内,以切换视图:
<Grid>
<ContentControl Name="mainWindowContent" Content="{Binding CurrentView}"></ContentControl>
</Grid>
主窗口viewModel是MainWinowViewModel,它只包含一个ViewModelBase命名为CurrentView和 iccommands ,每次将CurrentView切换到不同的viewModel:
public class MainWindowViewModel
{
// simplified properties
public ViewModelBase CurrentView { get; set; }
public ICommand ViewLoginCommand { get; }
public ICommand ViewSignUpCommand{ get; }
public MainWindowViewModel()
{
ViewLoginCommand =new MyCommand(SetCurrentViewToLoginViewModel);
ViewSignUpCommand = new MyCommand(SetCurrentViewToSignUpViewModel);
CurrentView = new LoginViewModel();
}
private void SetCurrentViewToLoginViewModel()
{
CurrentView = new LoginViewModel();
}
private void SetCurrentViewToSignUpViewModel()
{
CurrentView = new SignUpViewModel();
}
}
我将DataContext分配给MainWindow.CS
中的MainWindowViewModel所有正确的模板都在App.xaml文件中,该文件显示了每个ViewModel的视图:
<Application.Resources>
<DataTemplate DataType="{x:Type local:LoginViewModel}">
<Views:LoginView />
</DataTemplate>
<DataTemplate DataType="{x:Type local:SignUpViewModel}">
<Views:SignUpView />
</DataTemplate>
</Application.Resources>
同样,我希望主窗口一次只显示一个视图,除了导航视图。
我的问题:
我如何使,当登录成功,CurrentView将改变为SignUpViewModel。
我错过什么了吗?我的架构是否正确?你会做些不同的事情吗?
我看到它的方式,它只能发生,如果以某种方式在LoginViewModel,登录成功后,它将执行ViewSignUpCommand在DataContext中没有意义,也不能工作。
我看不出它是如何结合在一起的。谢谢你的帮助!
顺便说一句,请原谅我的英语。如果需要其他的(细节等)来了解大局,也请通知我。您正在通过命令更改CurrentView,该命令是好的,但是视图在没有通知的情况下不知道更改。这是通过实现INotifyPropertyChanged
接口完成的。
我通常从ViewModelBase派生每个视图模型类。ViewModelBase实现了INotifyPropertyChanged。请参阅联机示例以了解此类实现。
你应该像这样结束:
public class MainWindowViewModel:ViewModelBase
{
private ViewModelBase _CurrentView; //ViewModelBase or any common class,or interface of both types of views.
private ViewModelBase CurrentView
{
get
{
return _CurrentView;
}
set
{
if(_CurrentView != value)
{
_CurrentView = value;
OnPropertyChanged();
}
}
}
}
如果你不想麻烦一个可重用的ViewModelBase类,那么你可以简单地在MainWindowViewModel上实现INotifyPropertyChanged。