C# WPF使用MVVM模式切换视图,而不使用导航视图

C# WPF使用MVVM模式切换视图,而不使用导航视图,c#,wpf,wcf,mvvm,binding,C#,Wpf,Wcf,Mvvm,Binding,我正在使用MVVM模式构建我的第一个WPF应用程序 应用程序以包含登录按钮的登录视图开始 当我单击登录按钮时,它将执行LoginViewModel中的ICommand,如果登录成功,它将从服务器获得响应 (我正在建立一个基于WCF和WPF并带有用户凭据的聊天室) *我想要实现的是:如果登录成功,它将切换到注册视图 (我知道这没有任何意义,但它只是用于测试视图切换) 到目前为止,我一直在阅读有关通过按钮导航的内容。这不是你所理解的我的目标 我只想验证用户,然后加载聊天视图(我还没有,所以这就是为什

我正在使用MVVM模式构建我的第一个WPF应用程序

应用程序以包含登录按钮的登录视图开始

当我单击登录按钮时,它将执行LoginViewModel中的ICommand,如果登录成功,它将从服务器获得响应

(我正在建立一个基于WCF和WPF并带有用户凭据的聊天室)

*我想要实现的是:如果登录成功,它将切换到注册视图

(我知道这没有任何意义,但它只是用于测试视图切换)

到目前为止,我一直在阅读有关通过按钮导航的内容。这不是你所理解的我的目标

我只想验证用户,然后加载聊天视图(我还没有,所以这就是为什么我提到了没有任何意义的注册视图)

我有一个主窗口和Xaml代码,其中只包含内容控制,带有网格,以便切换视图:

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