WPF切换视图使用MVVM模式没有导航视图

本文关键字:视图 模式 导航 MVVM WPF | 更新日期: 2023-09-27 18:05:23

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

应用程序以login View开始,其中包含一个login按钮。

当我单击登录按钮时,它执行ICommandLoginViewModel中,如果登录成功,则从服务器获得响应。

(我正在用用户凭据构建基于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中没有意义,也不能工作。

我看不出它是如何结合在一起的。谢谢你的帮助!

顺便说一句,请原谅我的英语。如果需要其他的(细节等)来了解大局,也请通知我。

WPF切换视图使用MVVM模式没有导航视图

您正在通过命令更改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。