代码之家  ›  专栏  ›  技术社区  ›  user5856424

具有ViewModel绑定的WPF ContentControl不会更改(MVVM Light)

  •  1
  • user5856424  · 技术社区  · 9 年前

    我目前正在尝试在我的WPF应用程序中使用MVVM Light Toolkit(也使用定位器和SimpleIoC)的Messenger进行导航。

    我的主窗口有一个带有简单绑定的ContentControl。。

    <ContentControl Content="{Binding CurrentPageViewModel}"/>
    

    ..在带有Messenger的MainViewModel中

        private ViewModelBase _currentPageViewModel;
        private readonly LoginViewModel _loginViewModel;
        private readonly RegisterViewModel _registerViewModel;
    
        public MainViewModel()
        {
            RegisterMessenger();
    
            _loginViewModel = new LoginViewModel();
            _registerViewModel = new RegisterViewModel();
    
            _currentPageViewModel = _loginViewModel;
        }
    
        public ViewModelBase CurrentPageViewModel
        {
            get { return _currentPageViewModel; }
            set { Set(ref _currentPageViewModel, value); }
        }
    
        public void RegisterMessenger()
        {
            Messenger.Default.Register<NotificationMessage>(this, (message) =>
            {
                MessageBox.Show(message.Notification);
                // Checks the actual content of the message.
                switch (message.Notification)
                {
                    case "GoToLoginPage":
                        _currentPageViewModel = _loginViewModel;
                        break;
                    case "GoToRegisterPage":
                        _currentPageViewModel = _registerViewModel;
                        break;
                }
            });
        }
    

    例如,我用ICommand绑定了一个按钮,它向Messenger发送一个字符串以切换CurrentPageViewModel。。

    Messenger.Default.Send(new NotificationMessage("GoToRegisterPage"));
    

    为了告诉它应该显示哪个视图,我在应用程序中设置了它们。xml,如下图所示。。

    <DataTemplate DataType="{x:Type vm:LoginViewModel}">
         <view:LoginView />
    </DataTemplate>
    

    是的,我对RegisterViewModel也这样做了。。但是当单击按钮时,它会通过SwitchCase设置_currentPageViewModel,但ContentControl不会更新视图。。

    我找不到任何有用的东西(因为大部分都是愚蠢的,对吧?)。 我错过了什么或做错了什么?

    谢谢

    1 回复  |  直到 9 年前
        1
  •  2
  •   blindmeis    9 年前

    如果要设置视图模型,请使用Property,否则NotifyPropertyChanged不会被调用,WPF也不会更改任何内容。。

    public void RegisterMessenger()
    {
        Messenger.Default.Register<NotificationMessage>(this, (message) =>
        {
            MessageBox.Show(message.Notification);
            // Checks the actual content of the message.
            switch (message.Notification)
            {
                case "GoToLoginPage":
                    CurrentPageViewModel= _loginViewModel;
                    break;
                case "GoToRegisterPage":
                    CurrentPageViewModel= _registerViewModel;
                    break;
            }
        });
    }