使用DialogService时,如何将View的DataContext设置为ViewModel

时间:2014-09-26 00:31:48

标签: c# wpf mvvm modal-dialog

我一直在关注这种模式。 http://www.codeproject.com/Articles/36745/Showing-Dialogs-When-Using-the-MVVM-Pattern

但是,在此示例中,在PersonDialog.xaml.cs类中,我无法访问this.DataContext。它始终为空。由于我使用DialogService打开一个窗口(我将DataContext设置为ViewModel,并将数据从MainWindowViewModel传递给PersonDialogViewModel)我需要ViewModel的实例。我将无法从View创建另一个PersonDialogViewModel。

请建议我需要在后面的代码中从ViewModel访问数据。

这是代码。

//MainWindowViewModel.cs
PersonViewModel selectedPerson = persons.Single(p => p.IsSelected);
PersonDialogViewModel personDialogViewModel = new PersonDialogViewModel(selectedPerson.Person);
dialogService.ShowDialog<PersonDialog>(this, personDialogViewModel);

//In PersonDialogViewModel.cs
public PersonDialog()
{
    InitializeComponent();
    var obj = this.DataContext;//DataContext is always null.
}

1 个答案:

答案 0 :(得分:1)

在你的XAML中,对话框本身会有一个Loaded事件,例如

<UserControl
    x:Class="ClassName"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:D="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Loaded="UserControl_OnLoaded"
    Mc:Ignorable="D">

这个“UserControl_OnLoaded”事件处理程序将是你代码中的一个方法。如果你执行

var obj = this.DataContext;

此时,将设置数据上下文。构造函数是构造PersonDialog的点,而不是当对话服务将DataContext绑定到它时。