C# WPF使用MVVM模式切换视图,而不使用导航视图
我正在使用MVVM模式构建我的第一个WPF应用程序 应用程序以包含登录按钮的登录视图开始 当我单击登录按钮时,它将执行LoginViewModel中的ICommand,如果登录成功,它将从服务器获得响应 (我正在建立一个基于WCF和WPF并带有用户凭据的聊天室) *我想要实现的是:如果登录成功,它将切换到注册视图 (我知道这没有任何意义,但它只是用于测试视图切换) 到目前为止,我一直在阅读有关通过按钮导航的内容。这不是你所理解的我的目标 我只想验证用户,然后加载聊天视图(我还没有,所以这就是为什么我提到了没有任何意义的注册视图) 我有一个主窗口和Xaml代码,其中只包含内容控制,带有网格,以便切换视图:C# WPF使用MVVM模式切换视图,而不使用导航视图,c#,wpf,wcf,mvvm,binding,C#,Wpf,Wcf,Mvvm,Binding,我正在使用MVVM模式构建我的第一个WPF应用程序 应用程序以包含登录按钮的登录视图开始 当我单击登录按钮时,它将执行LoginViewModel中的ICommand,如果登录成功,它将从服务器获得响应 (我正在建立一个基于WCF和WPF并带有用户凭据的聊天室) *我想要实现的是:如果登录成功,它将切换到注册视图 (我知道这没有任何意义,但它只是用于测试视图切换) 到目前为止,我一直在阅读有关通过按钮导航的内容。这不是你所理解的我的目标 我只想验证用户,然后加载聊天视图(我还没有,所以这就是为什
<Grid>
<ContentControl Name="mainWindowContent" Content="{Binding CurrentView}"></ContentControl>
</Grid>
我将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派生每个viewmodel类。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();
}
}
}
}
如果不想麻烦使用可重用的ViewModel基类,那么只需在MainWindowViewModel上实现INotifyPropertyChanged即可
例如,请参见。是的,需要时,您必须执行命令从ViewModel切换视图:根据您的要求,“登录成功后”。为什么说不通呢?你没有展示这一点的实现,所以你不能声称它不起作用。。。
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();
}
}
}
}