70

根据 MSDN 上的x:Reference Markup Extension页面,x:Reference

引用在 XAML 标记中的其他位置声明的实例。引用指的是元素的 x:Name。

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

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

回顾第一页的备注部分:

x:参考和 WPF

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

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

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

现在,虽然我完全了​​解何时以及如何使用该ElementName属性,但我并不完全理解它与x:Reference标记扩展之间的区别。x:Reference任何人都可以解释这一点,特别是扩展评论部分显示的最后一句话吗?:

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

4

2 回答 2

77

基本上就像你说的那样,这两个几乎相同。但是,引擎盖下存在细微差别。

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

{Binding ElementName="..." }-> 首先它创建绑定对象,然后搜索对象名称,但不使用与 x:Reference 相同的技术。搜索算法在 VisualTree 中向上和/或向下移动以找到所需的元素。因此,始终需要一个功能性的 VisualTree。例如,在非 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}"/>
 ....

有点像:)

于 2013-10-08T10:14:48.833 回答
3

ElementName是平台特定的。即它可能存在也可能不存在,具体取决于您使用的平台。x:Reference将该概念提升为 XAML 本机功能。因此,任何支持 XAML 的平台都支持x:Reference.

于 2016-12-27T21:28:41.050 回答