具有 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不会更新视图。
我没有发现任何可以帮助的东西("主要是愚蠢,对吧?我错过了什么或做错了什么?
谢谢!
如果要
设置视图模型,请使用属性,否则不会调用 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;
}
});
}