20

有了{Binding ElementName=foo},它会查找视觉树还是逻辑树?

WPF 中的逻辑和可视化树 数据看,数据做

逻辑树何时重要?

在查找名称时,例如在 {Binding ElementName=Foo} 中,搜索会沿着祖先查找名称范围,就像它对可继承属性所做的那样。

通过附加行为在 Silverlight 中绑定 ElementName

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

编辑:

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

论据#1。

根据 MSDN 文章FrameworkElement 类

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

  • 对数据绑定和动态资源引用的支持:对数据绑定和资源的属性级支持由 DependencyProperty 类实现并体现在属性系统中,但能够解析存储为表达式的成员值(编程构造作为数据绑定和动态资源的基础)由 FrameworkElement 实现。有关详细信息,请参阅数据绑定概述和资源概述。

论点#2。

ElementName指向x:Name,所以应该如何找到这个名称。有一个NameScope概念。

对于大多数情况,在 FrameworkElement 和 FrameworkContentElement 上公开的 FindName 方法是更适合调用以按名称搜索元素的方法。FrameworkElement 和 FrameworkContentElement 公开的 Name 属性更适合用于将初始名称设置为标记属性。并且在 FrameworkElement 和 FrameworkContentElement 上公开的 RegisterName 方法对于在特定名称范围内建立名称是必要的(没有 NameScope 成员可以直接执行此操作;您必须先设置当前名称范围才能使用 RegisterName)。

另一方面,Visual 类既没有FindName方法,也没有实现INameScope

4

2 回答 2

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”会使背景变为绿色,如预期的那样。

于 2009-05-22T19:13:26.267 回答
0

某种意义上的ElementName绑定属性(请参阅下面的答案)在逻辑树上起作用,因为人们正在使用ElementName仅在 Xaml 中的逻辑树上预测特定控件。

它会查找视觉树还是逻辑树?

您提出的前提是错误的,任何一棵树本身都没有查找。一种是简单地为绑定使用的反射操作设置SourceDataContext属性,而不是默认为逻辑树的继承。

如果阅读Binding.ElementName Property (System.Windows.Data)的文档(我的粗体字):

“...ElementName 属性是您可以显式设置绑定并覆盖继承的数据上下文的方法之一。”

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

不多不少,最有可能在逻辑树中(但也没有),因为人们在 Xaml 中命名了逻辑项,但也可能在可视树中。


有关详细信息,请参阅数据绑定概述

于 2016-07-06T15:50:31.570 回答