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中的属性未显示在视图中

每次出现错误时,您似乎都在重新创建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)即可显示对话框。