我目前正在尝试通过MVVM Light Toolkit(还使用Locator和SimpleIoC)在Messenger中使用WPF应用程序进行导航。

我的MainWindow有一个带有简单Binding。的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绑定(bind)了一个按钮,该命令向Messenger发送了一个String来切换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。

我发现没有什么可以帮助的(主要是因为愚蠢,对吧?)。
我想念什么或做错什么?

谢谢!

最佳答案

如果要设置 View 模型,请使用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;
        }
    });
}

关于c# - 具有ViewModel绑定(bind)的WPF ContentControl不会更改(MVVM Light),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35081969/

10-12 12:22
查看更多