簡體   English   中英

具有ViewModel綁定的WPF ContentControl不會更改(MVVM Light)

[英]WPF ContentControl with ViewModel Binding won't change (MVVM Light)

我目前正在嘗試通過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綁定了一個按鈕,該命令向Messenger發送一個String來切換CurrentPageViewModel。

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

為了確定應該顯示哪個視圖,我在App.xml中將它們設置如下。

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

是的,我也使用RegisterViewModel做到了這一點。但是,當單擊Button時,它將通過SwitchCase設置_currentPageViewModel,但是ContentControl不會更新View。

我發現沒有什么可以幫助的(主要是因為愚蠢,對吧?)。 我想念什么或做錯什么?

謝謝!

如果要設置視圖模型,請使用屬性,否則不調用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;
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM