C# 什么是「;当前数据上下文“;?

C# 什么是「;当前数据上下文“;?,c#,wpf,C#,Wpf,我在这里使用WPF绑定备忘表: 我注意到它指的是像{Binding}和{Binding Name}这样的东西的“当前数据上下文”。在我看到的示例中,根窗口的DataContext被设置为某个对象,树中的几个级别的子控件能够绑定到它,而无需指定它所引用的元素的数据上下文。所以我的问题有两个: 什么是当前数据上下文,它是如何定义为“当前”的 作为#1的后续问题,当前数据上下文的“搜索顺序”(如果有)是什么?我的理解是,每个WPF控件都可以有自己的数据上下文,因此: 它是否只搜索父/子树,直到找到定

我在这里使用WPF绑定备忘表:

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

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

  • 提前感谢。

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

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


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

    1) 什么是当前数据上下文,它是如何定义为“当前”的

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

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

    是的,你的猜测是对的

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

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

    假设您有如下声明的TextBlock:

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

    将在当前数据上下文中搜索第一个
    Name
    属性。如果将显示找到的文本,但如果未找到属性,则文本将设置为
    BindingFailed

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

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


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

    1) 什么是当前数据上下文,它是如何定义为“当前”的

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

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

    是的,你的猜测是对的

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

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

    假设您有如下声明的TextBlock:

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

    将在当前数据上下文中搜索第一个
    Name
    属性。如果将显示找到的文本,但如果未找到属性,则文本将设置为
    BindingFailed

    如果未明确设置
    DataContext
    ,则它等于其父级
    DataContext
    。父母也一样。就是这样。@Johnbot那么这是否意味着这有助于在父/子树上遍历,直到找到一个父/子树,或者如果子树的DataContext未设置,则子树只能直接引用其父树?是否意味着它遍历树。查看答案。如果未明确设置
    DataContext
    ,则它等于其父级
    DataContext
    。父母也一样。就是这样。@Johnbot那么这是否意味着这有助于在父/子树上遍历,直到找到一个父/子树,或者如果子树的DataContext未设置,则子树只能直接引用其父树?是否意味着它遍历树。看看答案。这很有帮助,非常感谢。我在发帖后也读了这篇文章,这篇文章有助于完全澄清你的回答:欢迎你,罗伯特。我同意雷切尔的博客也提供了丰富的信息这很有帮助,非常感谢。我在发帖后也读了这篇文章,这篇文章有助于完全澄清你的回答:欢迎你,罗伯特。我同意雷切尔的博客也提供了丰富的信息