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

本文关键字:MVVM Light 绑定 ViewModel WPF ContentControl 具有 | 更新日期: 2023-09-27 18:32:34

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

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

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

..在 MainViewModel 中使用 Messenger

    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不会更新视图。

我没有发现任何可以帮助的东西("主要是愚蠢,对吧?我错过了什么或做错了什么?

谢谢!

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

如果要

设置视图模型,请使用属性,否则不会调用 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;
        }
    });
}