我有一个名为 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");
}
}
MainWindow.xaml
....
<Grid>
<vw:LogView Content="{Binding Path=ModalWindow}"/>
</Grid>
MainWindowViewModel 绑定(bind)到 MainWindow.xaml
SubViewModel 绑定(bind)到 SubView.xaml
MainWindow.xaml 加载多个 View ,其中之一是 SubView。
在 App.xaml 中,我创建了一个 ViewModel 实例并将其绑定(bind)到 MainWindow。
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow mainWindow = new MainWindow();
MainWindowViewModel viewModel = new MainWindowViewModel();
mainWindow.DataContext = viewModel;
mainWindow.Show();
}
我意识到,如果我在SubViewModel中创建模态窗口属性并将其绑定(bind)到SubView,则在启动后出现错误时会显示模态窗口。但这不行,因为 SubView 只是一个 DockPanel,覆盖了 MainWindow 的 1/4。 IE。 1/4 只覆盖了一个模态窗口,而不是整个主窗口。
当我从 SubViewModel 调用参数化构造函数时,我不确定为什么模态窗口没有出现在 MainWindow 中。当我调试时,我看到部分 _modalWindow = value;
具有正确的值,但在任何情况下模态窗口都不会显示。
我正在将 ViewModel 绑定(bind)到 MainWindow 的 Datacontext。这可能就是为什么我在启动时出现错误时看到模态窗口的原因。对于启动后的错误:我必须(从 SubViewModel 调用 MainWindowViewModel 中的参数化构造函数)再次对 Mainwindow 的数据上下文进行某种绑定(bind)吗?在不必创建 MainWindow 的新实例的情况下执行此操作的最佳方法是什么?因为 MainWindow 应该只创建一次。
非常感谢任何帮助。
最佳答案
看起来每次发生错误时您都在重新创建 ViewModel。如果是这样,您还需要重置 View 中的绑定(bind),这将破坏 MVVM 的目的。 而是拥有一个 ViewModel 实例,并使用 OnPropertyChanged() 将错误传播到 View 。
当然有很多方法可以做到这一点,但我通常在我的 View 中保留对 ViewModel 的引用,然后在 ViewModel 中保留对模型的引用。通过这种方式,Model 与 View/ViewModel 完全分离,同样 ViewModel 与 View 分离。
关于c# - ViewModel 中的属性未显示在 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6340995/