【问题标题】:WPF ContentControl with ViewModel Binding won't change (MVVM Light)带有 ViewModel 绑定的 WPF ContentControl 不会改变(MVVM Light)
【发布时间】:2016-05-07 00:54:10
【问题描述】:

我目前正在尝试在我的 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"));

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

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

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

我没有找到任何有用的方法(主要是因为愚蠢,对吧?)。 我错过了什么或做错了什么?

谢谢!

【问题讨论】:

    标签: c# wpf xaml mvvm mvvm-light


    【解决方案1】:

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

    【讨论】:

    • 不知道,wpf 总是错误的数据上下文或错误的绑定表达式或缺少 NotifyPropertyChanged :)
    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多