c# - ViewModel 中的属性未显示在 View 中

标签 c# wpf data-binding mvvm datacontext

我有一个名为 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/

相关文章:

c# - 如何正确绑定(bind) WPF TreeView 控件并有效地显示数据的层次结构?

c# - 如何在 WPF 中绑定(bind)对象的两个实例(或者我可以吗?)

c# - NetworkStream.Write数据似乎没有到达接收套接字

c# - 将 WPF 窗口附加到另一个进程的窗口

c# - 从 WCF 中的通用契约(Contract)继承

WPF - 如何通过 MVVM 绑定(bind)控件

c# - 使用 ValueInjecter,我可以注入(inject)私有(private)属性吗?

c# - WPF 功能区以编程方式折叠和展开

wpf - 如何将插入符号分配给 WPF 中的控件

grails - 通过唯一名称绑定(bind)域类