什么是“当前DataContext”?

时间:2013-12-29 18:24:20

标签: c# wpf

我在这里使用这个WPF绑定备忘单:
http://www.nbdtech.com/Free/WpfBinding.pdf

我注意到它引用了{Binding}{Binding Name}之类的“当前DataContext”。在我看到的示例中,根Window的DataContext被设置为某个对象,并且子控件中的几个级别的子控件能够绑定到它而无需指定它所引用的元素的数据上下文。所以我的问题有两个:

  1. 什么是当前的DataContext,它是如何定义为“当前”的?
  2. 作为#1的后续问题,当前数据上下文的“搜索顺序”(如果有这样的事情)是什么?我的理解是每个WPF控件都有自己的数据上下文,所以:
    1. 是否只搜索父/子树,直到找到定义了DataContext的第一个父级?
    2. 如果它没有在该DataContext上找到指定的属性,它会跳过它并找到具有该属性的下一个数据上下文,该怎么办?
  3. 提前致谢。

1 个答案:

答案 0 :(得分:3)

DataContext是可继承的依赖属性,即子控件将继承它,除非明确设置。

您甚至可以通过在注册Dependency属性时设置FrameworkPropertyMetadataOptions.Inherits标志来使您的自定义依赖项属性可继承。


现在说,让我们逐一回答你的问题:

  

1)什么是当前的DataContext,它是如何定义为“当前”的?

当前表示当前为DataContext 设置的值,可以显式设置,也可以从其父级继承。

  

2)它是否只搜索父/子树,直到它找到定义了DataContext的第一个父项?

,您的猜测是正确的。

  

3)如果在该DataContext上找不到指定的属性,该怎么办?   它会跳过它并找到具有该属性的下一个数据上下文吗?

,如果在DataContext上找不到该属性,绑定将以静默方式中断,并在输出窗口中记录错误。 但是,如果绑定失败,您可以提供FallbackValue

假设你有像这样声明的TextBlock:

<TextBlock Text="{Binding Name, FallbackValue=BindingFailed}"/>

将在当前的DataContext中搜索第一个Name属性。如果找到了文本,但是如果找不到属性,则文本将设置为BindingFailed