x:Reference和ElementName有什么区别?

She*_*dan 54 wpf markup xaml

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

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

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

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

回顾第一页上的备注部分:

x:参考和WPF

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

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

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

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

此一般指导的例外情况可能包括存在数据上下文或其他作用域考虑因素的情况,这些因素使得数据绑定不切实际且不涉及标记编译.

dev*_*hog 61

基本上就像你说的那两个几乎一样.然而,引擎盖下的细微差别.

{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}"/>
 ....
Run Code Online (Sandbox Code Playgroud)

这有效:

<StackPanel>
 <Button x:name="bttn1" Visibility="Hidden">Click me</Button>
 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Visibility="{Binding Source={x:Reference bttn1}, Path=DataContext.Visibility}"/>
 ....
Run Code Online (Sandbox Code Playgroud)

有点那样:)

  • +1.顺便问一下,您是否拥有此信息的来源,还是仅仅来自经验?这里没有提到的一件事是,一个孩子不能"x:引用"它的父(这种关系似乎依赖于上下文,而不是视觉树),因为这会导致循环引用问题.由于其他一些神秘的问题,有时参考也会无声地解决. (10认同)
  • 那么主要的区别与控件是否是`UIElement`有关吗? (2认同)
  • 此信息的来源是源代码本身:) (2认同)

Mic*_*own 5

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