ViewModel中的属性未显示在视图中
本文关键字:视图 显示 属性 ViewModel | 更新日期: 2023-09-27 17:59:16
我有一个名为MainWindowViewModel的ViewModel。在这篇文章中,我有一个属性,当出现错误时,它会显示一个模式窗口。只要在启动过程中出现错误,这种方法就可以正常工作。
当启动后出现错误时,在SubViewModel中,我会调用MainWindowViewModel中的参数化构造函数。
MainWindowViewModel.cs
public MainWindowViewModel()
{
if (!isServerRunning)
{
this.ModalWindow = new LogViewModel("Server is down.");
}
else
{
this.ModalWindow = new LogViewModel();
}
}
public MainWindowViewModel(string logMessage)
{
this.ModalWindow = new LogViewModel(logMessage);
}
public LogViewModel ModalWindow
{
get
{
return _modalWindow;
}
set
{
_modalWindow = value;
OnPropertyChanged("ModalWindow");
}
}
主窗口.xaml
<Grid>
<vw:LogView Content="{Binding Path=ModalWindow}"/>
</Grid>
MainWindowViewModel绑定到MainWindow.xaml
SubViewModel绑定到SubView.xaml
MainWindow.xaml加载多个视图,其中一个是SubView。
在App.xaml中,我创建了ViewModel的一个实例,并将其绑定到MainWindow。
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow mainWindow = new MainWindow();
MainWindowViewModel viewModel = new MainWindowViewModel();
mainWindow.DataContext = viewModel;
mainWindow.Show();
}
我意识到,如果我在SubViewModel中创建模态窗口属性并将其绑定到SubView,那么当启动后出现错误时,模态窗口就会显示出来。但这并不好,因为SubView只是一个覆盖主窗口1/4的DockPanel。即1/4只覆盖了一个模态窗口,而不是整个主窗口。
当我从SubViewModel调用参数化构造函数时,我不知道为什么模态窗口没有出现在MainWindow中。当我调试时,我看到零件_modalWindow = value;
具有正确的值,但在任何情况下都不会显示模式窗口。
我正在将ViewModel绑定到MainWindow的Datacontext。这可能就是我在启动时出现错误时看到Modal窗口的原因。对于启动后的错误:我必须(从SubViewModel中调用MainWindowViewModel中的参数化构造函数)再次绑定到Mainwindow的数据上下文吗?在不必创建MainWindow的新实例的情况下,最好的方法是什么?因为MainWindow应该只创建一次。
非常感谢您的帮助。
每次出现错误时,您似乎都在重新创建ViewModel。如果是这样,您还需要重置视图中的绑定,这将违背MVVM的目的。而是有一个ViewModel实例,并使用OnPropertyChanged()将错误传播到视图。
当然有很多方法可以做到这一点,但我通常会在视图中引用ViewModel,然后在ViewModel中引用Model。通过这种方式,模型与View/ViewModel完全解耦,同样,ViewModel也与View解耦。
您不应该一次又一次地创建MainWindowViewModel。它应该创建一次,并设置为主窗口的datacontext。
问题在于显示对话框的方法。这让事情变得复杂起来。
显示对话框的最佳解决方案是使用mvvmlight工具包的信使。请查看此以获取有关其用法的提示。
这就是如何使用mvvmlight工具包的信使来显示对话框:
视图:
Messenger.Default.Register<DialogMessage>(
view,
msg =>
{
var result = MessageBox.Show(
msg.Content,
msg.Caption,
msg.Button,
msg.Icon);
}
);
ViewModel:
private void ShowMessageBox(string msgStr, string capStr, MessageBoxButton btn, MessageBoxImage img)
{
var message = new DialogMessage(msgStr, null)
{
Button = btn,
Caption = capStr,
Icon = img
};
Messenger.Default.Send(message);
}
只需从任何视图模型中调用上述方法(ShowMessageBox)即可显示对话框。