使用MVVM模式而不使用导航视图的WPF swtich视图

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

该应用程序以包含登录按钮的登录View开始。

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

(我正在建立一个基于WCF和WPF的用户凭据)

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

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

到目前为止,我一直在阅读关于通过按钮导航 。 你的理解并不是我的目标。

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

我有一个主窗口和Xaml代码,它只包含内容控件,并通过网格来切换视图:

   <Grid>
    <ContentControl Name="mainWindowContent" Content="{Binding CurrentView}"></ContentControl>
  </Grid>

主窗口viewModel是MainWinowViewModel ,它只包含名为CurrentViewViewModelBase和每次将CurrentView切换到不同ViewModel的ICommands

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

我在MainWindow.CS中将DataContext分配给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>

同样,我希望主窗口一次只显示1个视图,而不需要放置导航视图。

我的问题:

我如何做到这一点,当登录成功时,CurrentView将更改为SignUpViewModel。

我错过了什么? 我的架构是否正确? 你会做任何不同的事情吗?

我看到它的方式,它只能以某种方式在LoginViewModel内发生,在登录成功后,它将在DataContext中执行ViewSignUpCommand ,这是没有意义的,也不起作用。

我看不出它是如何结合在一起的。 Thx在前面为您提供帮助!

顺便说一句,请原谅我的英语。 如果需要其他内容(细节等)以便看到大图,请通知我。


您正在通过一个命令更改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();
                }
            }
        }
}

如果你不想打扰一个可重用的ViewModelBase类,那么你可以简单地在MainWindowViewModel上实现INotifyPropertyChanged。

以http://www.c-sharpcorner.com/uploadfile/0b73e1/mvvm-model-view-viewmodel-introduction-part-3/为例。

链接地址: http://www.djcxy.com/p/56187.html

上一篇: WPF swtich views using MVVM pattern without Navigation view

下一篇: Navigate through UserControl with MVVM LIGHT (WPF)