【问题标题】:What is the difference between x:Reference and ElementName?x:Reference 和 ElementName 有什么区别?
【发布时间】:2013-10-15 03:56:14
【问题描述】:

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

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

根据MSDN上的Binding.ElementName Property页面,ElementName

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

回顾第一页的备注部分:

x:参考和 WPF

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

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

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

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

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

【问题讨论】:

    标签: wpf xaml markup


    【解决方案1】:

    基本上就像你说的那样,这两个几乎是一样的。但是,在底层存在细微差别。

    {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}"/>
     ....
    

    有点像:)

    【讨论】:

    • 所以主要区别在于控件是否为UIElement
    • +1。顺便说一句,您是否有此信息的来源,还是仅凭经验?这里没有提到的一件事是,孩子不能x:Reference 其父母(这种关系似乎取决于上下文,而不是视觉树),因为这会导致循环引用问题。有时,由于其他一些神秘的问题,引用也会默默地无法解决。
    • 此信息的来源是源代码本身:)
    • 我试过你的例子是正常的吗,即使在运行时一切正常,设计师也会给我一个空指针异常?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      相关资源
      最近更新 更多