视图模型没有更新为DataContext

本文关键字:DataContext 更新 模型 视图 | 更新日期: 2023-09-27 18:15:12

我有一个工作程序,其中视图模型将数据提供给视图。这是在构造函数和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(); }
}
问题是为什么会这样。或者说,如果应该是这样的话。我在想,如果它不应该表现得像这样,也许我在代码的其他地方有问题,使流…

视图模型没有更新为DataContext

我认为你需要理解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

你基本上是重新分配一个私有属性,而不是DataContext。

  1. 创建TheViewModel的实例A
  2. 让DataContext指向实例A
  3. 创建TheViewModel实例B
  4. 使TheViewModel私有属性指向实例B
  5. DataContext仍然指向实例A

——比;没有理由刷新DataContext。你没碰它。它仍然指向初始实例A,它仍然在内存中。

编辑:

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