【问题标题】:What is the "Current DataContext"?什么是“当前数据上下文”?
【发布时间】:2013-12-29 18:24:20
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 如果DataContext 没有明确设置,那么它等于它的父级DataContext。对父母也是如此。就是这样。
  • @Johnbot 那么这是否意味着这有助于沿着父/子树向上走直到找到一个,或者如果该子的 DataContext 未设置,则该子只能直接引用其父级?
  • 它在树上行走。查看答案。

标签: c# wpf


【解决方案1】:

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

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


话虽如此,让我们一一回答您的问题:

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

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

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

是的,你猜对了。

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

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

假设你有这样声明的 TextBlock:

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

将在当前 DataContext 中搜索第一个 Name 属性。如果找到的文本将显示,但如果没有找到属性,文本将设置为BindingFailed

【讨论】:

  • 这很有帮助,非常感谢。发布后我还阅读了这篇文章,这有助于完全澄清它+您的回答:rachel53461.wordpress.com/2012/07/14/…
  • 欢迎罗伯特。我同意 Rachael 的博客也提供了非常丰富的信息。 :)
猜你喜欢
  • 2011-06-13
  • 2016-03-03
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2012-11-15
  • 2012-08-27
相关资源
最近更新 更多