视图模型没有更新为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
是一个依赖属性。
它的定义是这样的:
[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。
- 创建
TheViewModel
的实例A - 让DataContext指向实例A
- 创建
TheViewModel
实例B - 使
TheViewModel
私有属性指向实例B - DataContext仍然指向实例A
——比;没有理由刷新DataContext。你没碰它。它仍然指向初始实例A,它仍然在内存中。
编辑:
这个答案是假设绑定使用
DataContext
作为源,而不是TheViewModel
。DataContext
是一个DependencyProperty,而TheViewModel
不是。用TheViewModel
替换整个视图模型作为绑定源需要用依赖属性或NotifyPropertyChanged
通知视图