ViewModel中的属性未显示在View中

|| 我有一个称为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绑定到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只是一个覆盖MainWindow 1/4的DockPanel。即1/4仅用一个模式窗口而不是整个MainWindow覆盖。 我不确定为什么当我从SubViewModel调用参数化的构造函数时,模式窗口不会出现在MainWindow中。当我调试时,我看到部分“ 3”具有正确的值,但是无论如何都不会出现模态窗口。 我将ViewModel绑定到MainWindow的Datacontext。这可能就是为什么在启动时发生错误时我看到“模态”窗口的原因。对于启动后的错误:我是否必须(从SubViewModel调用MainWindowViewModel中的参数化构造函数)再次对Mainwindow的数据上下文进行某种绑定?无需创建MainWindow的新实例的最佳方法是什么?因为MainWindow只能创建一次。 任何帮助深表感谢。     
已邀请:
        好像您每次发生错误时都在重新创建ViewModel。如果是这样,您还需要在视图中重设绑定,这将使MVVM的目的无法实现。 而是拥有一个ViewModel实例,并使用OnPropertyChanged()将错误传播到View。 当然,有很多方法可以做到这一点,但是我通常在我的View中保留对ViewModel的引用,然后在ViewModel中保留对Model的引用。这样,模型就完全从View / ViewModel解耦了,同样,ViewModel也从View解耦了。     
        您不应一次又一次地创建MainWindowViewModel。应该只创建一次并将其设置为主窗口的datacontext。 问题在于您要使用的显示对话框的方法。这使事情变得复杂。 显示对话框的最佳解决方案是使用mvvmlight工具箱的Messenger。检查此用法以获得一些提示。 这是使用mvvmlight工具箱的Messenger来显示对话框的方法: 视图:
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);
}
只需从任何viewmodel调用上述方法(ShowMessageBox)即可显示一个对话框。     

要回复问题请先登录注册