【问题标题】:How do I set DataContext of a View to ViewModel when using DialogService使用 DialogService 时如何将 View 的 DataContext 设置为 ViewModel
【发布时间】:2014-09-26 00:31:47
【问题描述】:

我一直遵循这种模式。 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.
}

【问题讨论】:

  • 您应该在这种情况下将视图分配给 PersonDialog 及其 viewModel。像 this.DataContext = new PersonDialogViewModel().
  • 在 ctor 中,datacontext 为空,所以一切都很好。顺便说一句,我这样对话:stackoverflow.com/questions/3801681/…

标签: c# wpf mvvm modal-dialog


【解决方案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 已被您的对话服务绑定到它时。

【讨论】:

  • 谢谢!这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
相关资源
最近更新 更多