视图模型未更新为DataContext

时间:2015-09-30 13:04:05

标签: c# wpf xaml mvvm datacontext

我有一个工作程序,其中视图模型将数据提供给视图。这在构造函数中完成,也在 Refresh()方法中完成,如下所示。我通常会将一个私有属性引用到视图模型,因为我想在与它进行通信时省略强制转换。

public class TheView
{
  private ViewModel TheViewModel { get; set; }

  public TheView()
  {
    TheViewModel = new ViewModel();
    DataContext = TheViewModel;
  }

  public Refresh()
  {
    TheViewModel = new ViewModel();
    DataContext = TheViewModel;
  }
}

然后,我已经准备好并开始追逐线条了。由于构造函数将 DataContext 连接到属性 TheViewModel ,我想我可以分配给后者,而前者会自己更新它的内容。令我失望的是,我发现它并非如此。以下为我提供正确的对象列表 DataContext 不受影响。

public class TheView
{
  private ViewModel TheViewModel { get; set; }

  public TheView()
  {
    TheViewModel = new ViewModel();
    DataContext = TheViewModel;
  }

  public Refresh() { TheViewModel = new ViewModel(); }
}

问题是为什么会这样。或者更确切地说,如果它应该如此。我想,如果它不应该像这样表现,也许我在代码中的其他地方有问题,那就是流量......

2 个答案:

答案 0 :(得分:2)

我认为您确实需要了解DataContext是依赖属性。

它的定义如下:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Localizability(LocalizationCategory.NeverLocalize)]
public object DataContext
{
  get
  {
    return this.GetValue(FrameworkElement.DataContextProperty);
  }
  set
  {
    this.SetValue(FrameworkElement.DataContextProperty, value);
  }
}

...

    public static readonly DependencyProperty DataContextProperty = 
DependencyProperty.Register("DataContext", typeof (object...

依赖属性不仅仅是普通的.NET属性,因为它们支持

  • 更改通知
  • 属性值继承
  • 确定值的提供商

在您的情况下,这是“更改通知”主题,这很重要。

当您(重新)为属性(即DataContext)分配值时,WPF将自动获取此更改。在这种情况下,更改通知是在依赖属性的setter中完成的,可以这么说。

如果分配给“普通”属性或甚至是私有字段,则不是这种情况(即不调用DataContext属性的setter),即使它指向DataContext。

答案 1 :(得分:1)

您基本上是在重新分配私有属性,而不是DataContext。

  1. 您创建了TheViewModel
  2. 的实例A.
  3. 您将DataContext指向实例A
  4. 您创建了TheViewModel
  5. 的实例B.
  6. 您将TheViewModel私有财产指向实例B
  7. DataContext仍然指向实例A
  8. - >没有理由要刷新DataContext。你没碰过它。它仍指向初始实例A,它仍在内存中。

      

    修改

         

    答案是假设绑定使用DataContext作为来源,而不是TheViewModelDataContext是DependencyProperty,而TheViewModel不是。{1}}。用TheViewModel替换整个视图模型作为绑定源需要通过依赖属性或NotifyPropertyChanged

    通知视图