拥有{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。
答案 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。