我目前正试图在我的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 ..
我没有发现什么可以帮助(导致大多数愚蠢,对吧?)。 我错过了什么或做错了什么?
谢谢!
答案 0 :(得分:2)
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;
}
});
}