X: Reference 和 ElementName 之间的区别是什么?

根据 MSDN 上的 参考标记扩展页面,x:Reference

引用 XAML 标记中其他地方声明的实例。引用元素的 x: Name。

根据 MSDN 上的 Binding.ElementName 属性页面,ElementName

感兴趣元素的 Name 属性或 x: Name Directive 的值。

回顾第一页的备注部分:

X: 参考文献和 WPF

在 WPF 和 XAML2006中,元素引用由 ElementName 绑定的框架级特性处理。对于大多数 WPF 应用程序和方案,仍应使用 ElementName 绑定。本一般指南的例外情况可能包括存在数据上下文或其他范围界定考虑因素,使得数据绑定不切实际以及不涉及标记编译的情况。

为了完整起见,以下是 ElementName页面备注部分的一部分:

当您希望绑定到应用程序中另一个元素的属性时,此属性非常有用。例如,如果希望使用 Slider 控制应用程序中另一个控件的高度,或者希望将控件的 Content 绑定到 ListBox 控件的 SelectedValue 属性。

现在,虽然我完全知道什么时候以及如何使用 ElementName属性,但是我不完全理解它和 x:Reference标记扩展之间的区别。有没有人能解释一下,特别是对 x:Reference备注部分的最后一句话进行详细说明?:

本一般指南的例外情况可能包括存在数据上下文或其他范围界定考虑因素,使得数据绑定不切实际以及不涉及标记编译的情况。

28592 次浏览

基本上就像你说的那样,这两者几乎是一样的,但是在引擎盖下面有一些细微的差别。

> 只返回一个对象的引用,它不会在两个属性之间建立像绑定这样的“桥梁”。在所有这一切背后,正在使用的服务是在特定范围(通常是窗口本身)中搜索给定名称。

首先,它创建绑定对象,然后搜索对象名,但不使用与 x: Reference 相同的技术。搜索算法在 VisualTree 中向上和/或向下移动以找到所需的元素。因此,总是需要一个功能性的 VisualTree。例如,当在 Non-UiElement 内部使用时,它将无法工作。最后,约束留下来,做它每天的面包。

这行不通:

<StackPanel>
<Button x:name="bttn1" Visibility="Hidden">Click me</Button>
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding ElementName=bttn1, Path=DataContext.Visibility}"/>
....

这种方法是有效的:

<StackPanel>
<Button x:name="bttn1" Visibility="Hidden">Click me</Button>
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Visibility="{Binding Source={x:Reference bttn1}, Path=DataContext.Visibility}"/>
....

就像这样:)

ElementName是特定于平台的。也就是说,它可能存在,也可能不存在,这取决于你使用的平台。x:Reference将这个概念提升为 XAML 本机特性。因此,任何支持 XAML 的平台都支持 x:Reference