【问题标题】:Differences between ElementName="<Me>" and RelativeSource self?ElementName="<Me>" 和 RelativeSource 之间的区别?
【发布时间】:2009-03-10 15:13:00
【问题描述】:

通过名称进行绑定自引用与通过 RelativeSource 进行自引用之间有什么区别?

例如:

<!-- Self referential via name -->
<Window ...
    x:Name="This"
    DataContext="{Binding Path=Data, ElementName=This}"/>

<!-- Self referential via RelativeSource -->
<Window ...
    x:Name="This"
    DataContext="{Binding Path=Data, RelativeSource={RelativeSource Self}}"/>

在我的项目中,它们的行为似乎相同,但我直接在窗口中使用它们。这意味着我立即更喜欢前者,因为它打字更少。

RelativeSource 的唯一优势是它能够在(例如)广泛使用的样式中进行自我引用吗?还是有一些额外的语义差异?

【问题讨论】:

    标签: wpf data-binding relativesource elementname


    【解决方案1】:

    警告:不是 WPF 向导

    当您像示例中那样直接绑定到 WPF 元素时,没有区别。 "This" 是可解析的,将绑定到与 Self 相同的项目。

    我怀疑不同之处在于当您通过诸如 Style 之类的构造进行绑定时。在这种情况下,您真正​​想要绑定的是应用样式的元素。在这种情况下,RelativeSource Self 会给你那个元素,其中“this”只会给你一个 Style 实例。

    【讨论】:

    • 这也是我唯一能想到或找到的东西。不过,我遇到了很多其他问题:WPF,我错过了信息,所以我想看看其他人是否对此有所了解。谢谢,贾里德。 :)
    【解决方案2】:

    如果您倾向于大量重构控件的名称,那么使用自引用形式可能更可取,否则我会说这是基于性能的调用。构建一个小测试,看看哪种类型的绑定性能更好,然后选择那个。如果性能差异可以忽略不计,那么我肯定会考虑其他可维护性考虑因素,例如整体外观和输入时间。另外不要忘记,在使用自引用表单时,您不必为元素命名,因此在比较鼠标和键盘之间的输入和上下文切换时,您必须包括 ElementName 表单的额外命名要求。

    就个人而言,我更喜欢引用绑定形式,因为它可以更轻松地进行重构,并且在设置绑定时我不必在 XAML 文档中移动以添加元素名称。

    【讨论】:

      【解决方案3】:

      您为什么认为它们之间存在差异?我认为它们应该是相同的,因为它们是指同一个元素的两种方式。

      【讨论】:

      • “我认为”和“应该”不构成答案。考虑评估每种方法如何解决可能导致差异的目标和场景。请参阅 JaredPar 的回答。
      猜你喜欢
      • 2012-05-15
      • 2011-02-20
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      相关资源
      最近更新 更多