使用ViewModel绑定的WPF ContentControl不会发生变化(MVVM Light)

时间:2016-01-29 10:18:20

标签: c# wpf xaml mvvm mvvm-light

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

我的MainWindow有一个带简单绑定的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"));

为了告诉它应该显示哪个View,我将它们设置在App.xml中,就像这样..

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

是的,我也使用RegisterViewModel做了..但是当单击Button时,它会通过SwitchCase设置_currentPageViewModel,但ContentControl不会更新View ..

我没有发现什么可以帮助(导致大多数愚蠢,对吧?)。 我错过了什么或做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

如果你想设置viewmodel,请使用该属性,否则不会调用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;
        }
    });
}