我目前正在尝试通过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/