ViewModel中的属性未显示在View中

时间:2011-06-14 08:31:37

标签: 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绑定到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中。当我调试时,我看到部件_modalWindow = value;具有正确的值,但无论如何都没有出现模态窗口。

我将ViewModel绑定到MainWindow的Datacontext。这可能是我在启动时发生错误时看到Modal窗口的原因。对于启动后的错误:我必须(从SubViewModel调用MainWindowViewModel中的参数化构造函数)再次对Mainwindow的datacontext进行某种绑定吗?如何在不创建MainWindow新实例的情况下实现这一目标的最佳方法是什么?因为MainWindow只能创建一次。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

每次出现错误时,您似乎都在重新创建ViewModel。如果是这样,您还需要在视图中重置绑定,这将破坏MVVM的目的。 而是拥有ViewModel的一个实例,并使用OnPropertyChanged()将错误传播到View。

当然有很多方法可以做到这一点,但我通常在视图中保留对ViewModel的引用,然后在ViewModel中引用Model。这样,Model与View / ViewModel完全分离,同样ViewModel与View分离。

答案 1 :(得分:0)

您不应该反复创建MainWindowViewModel。它应该被创建一次并设置为主窗口的datacontext。

问题在于您要显示对话框的方法。这使事情变得复杂。

显示对话框的最佳解决方案是使用mvvmlight toolkit的messenger。查看this以获取有关其使用情况的一些提示。

这是你可以使用mvvmlight toolkit的messenger来显示对话框的方法:

查看:

Messenger.Default.Register<DialogMessage>(
         view,
         msg =>
         {
             var result = MessageBox.Show(
                 msg.Content,
                 msg.Caption,
                 msg.Button,
                 msg.Icon);
         }
);

视图模型:

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)来显示一个对话框。