绑定ElementName。它是使用Visual Tree还是Logical Tree

时间:2009-04-01 14:44:16

标签: wpf binding elementname visual-tree logical-tree

拥有{Binding ElementName=foo},它会查找视觉或逻辑树吗?

Of logical and visual trees in WPF | Data See, Data Do

  

逻辑树什么时候重要?

     

查找名称时,例如   {Binding ElementName = Foo},搜索   走向祖先寻找一个   名称范围,再次就像它一样   可继承的属性。

ElementName binding in Silverlight via Attached Behaviours

  

为了实现这一点,WPF提供了   ElementName和RelativeSource   绑定,给你一个强大的   定位其他元素的机制   在您的可视树中绑定到

修改

它看起来像ElementName用于绑定的逻辑树。

论据#1。

根据MSDN文章FrameworkElement Class

  

FrameworkElement扩展了UIElement   并添加以下功能:

     
      
  • 支持数据绑定和   动态资源引用:   属性级数据支持   绑定和资源实现   通过DependencyProperty类和   体现在物业系统中,但是   解析成员价值的能力   存储为表达式(   编程构造的基础   数据绑定和动态   资源)由。实施   FrameworkElement的。更多   信息,请参阅数据绑定概述   和资源概述。
  •   

论据#2。

ElementName指向x:Name,因此应该找到这个名称。有一个NameScope概念。

  

对于大多数情况,FindName   FrameworkElement上公开的方法   和FrameworkContentElement更多   适当的方法来调用搜索   按名称的元素。名字   FrameworkElement公开的属性   和FrameworkContentElement更多   用于设置的适当属性   初始名称为标记属性。   并公开了RegisterName方法   在FrameworkElement和   FrameworkContentElement是必需的   建立一个特定的名称   namescope(没有NameScope   可以直接做到这一点的成员;您   必须先设置当前的名称范围   使用RegisterName)。

另一方面,Visual class既没有FindName方法,也没有实施INameScope

2 个答案:

答案 0 :(得分:6)

我认为这是合乎逻辑的树。使用ControlTemplates时,您将一个可视树替换为另一个,但我认为您不能引用ControlTemplate中定义的名称。

例如:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.Resources>
            <ControlTemplate x:Key="Foo" TargetType="Button">
                <Border x:Name="border" Background="Red">
                    <Label Content="{TemplateBinding Content}"></Label>
                </Border>
            </ControlTemplate>
        </Grid.Resources>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Button x:Name="buttonFoo" Background="Green" HorizontalAlignment="Center" VerticalAlignment="Center" Template="{DynamicResource Foo}">Foo</Button>
        <Label x:Name="labelBar" Grid.Column="1"  HorizontalAlignment="Center" VerticalAlignment="Center" Background="{Binding ElementName=border, Path=Background}">Bar</Label>
    </Grid>
</Page>

在ControlTemplate中找不到名为“border”的元素,但将labelBar绑定中的ElementName更改为“buttonFoo”会使背景为绿色,如预期的那样。

答案 1 :(得分:0)

绑定ElementName属性在某种意义上(参见下面的答案)在逻辑树之外工作,因为一个人正在使用ElementName来仅仅对一个特定控件进行神圣操作Xaml中的逻辑树。

  

会查找视觉或逻辑树吗?

你提出的前提是错误的,任何一棵树上都没有查找。一种是为绑定使用的反射操作设置 Source 属性,而不是默认为逻辑树的继承DataContext

如果有人阅读Binding.ElementName Property (System.Windows.Data)(bolding mine)的文档:

  

&#34; ... ElementName属性是您可以显式设置Binding的并覆盖继承的数据上下文的方法之一。&#34;

源是任何实例化对象,它位于当前操作命名空间内,可以访问和反射。

不多也不少,很可能会在逻辑树中(但也没有),因为人们中命名 Xaml中的逻辑项,但也可能在可视化树中

有关详细信息,请参阅Data Binding Overview