根据MSDN上的x:Reference Markup Extension页面,x:Reference
引用在XAML标记中的其他位置声明的实例。引用引用元素的x:Name。
根据MSDN上的Binding.ElementName Property页面,ElementName
Name属性的值或x:感兴趣元素的Name Directive。
回顾第一页上的备注部分:
x:参考和WPF
在WPF和XAML 2006中,元素引用由ElementName绑定的框架级功能解决。对于大多数WPF应用程序和方案,仍应使用ElementName绑定。此一般指导的例外情况可能包括存在数据上下文或其他范围考虑因素的情况,这些因素会导致数据绑定不切实际且不涉及标记编译。
为了完整起见,以下是ElementName
页面上备注部分的一部分:
当您想要绑定到应用程序中另一个元素的属性时,此属性很有用。例如,如果要使用Slider控制应用程序中另一个控件的高度,或者想要将控件的内容绑定到ListBox控件的SelectedValue属性。
现在,虽然我完全了解何时以及如何使用ElementName
属性,但我并不完全理解它与x:Reference
标记扩展之间的区别。任何人都可以解释一下这一点,特别是扩展x:Reference
备注部分显示的最后一句话:
此一般指导的例外情况可能包括存在数据上下文或其他范围考虑因素的情况,这些因素会导致数据绑定不切实际且不涉及标记编译。
答案 0 :(得分:60)
基本上就像你说的那两个几乎一样。然而,引擎盖下的细微差别。
{x:Reference ...}
- >只返回一个对象的引用,它不会创建两个属性之间的“桥接”,如绑定。在所有使用服务的背后,搜索特定范围内的给定名称,通常是窗口本身。
{Binding ElementName="..." }
- >首先,它创建了绑定对象,然后它搜索对象名称,但不是通过使用与x:Reference相同的技术。搜索算法在VisualTree中向上和/或向下移动以找到所需的元素。因此,总是需要功能性的VisualTree。作为在Non-UiElement中使用的示例,它将不起作用。最后,Binding会保留并每天吃面包。
这不起作用:
<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}"/>
....
有点像:)
答案 1 :(得分:3)
ElementName是特定于平台的。即根据您使用的平台,它可能存在也可能不存在。 x:Reference将该概念提升为XAML本机功能。因此,任何支持XAML的平台都支持x:Reference。