ElementName =“<me>”和RelativeSource self之间的区别?</me>

时间:2009-03-10 15:13:00

标签: wpf data-binding relativesource elementname

通过名称进行绑定自引用与通过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}}"/>

在我的项目中,它们看起来行为相同,但我直接在Window中使用它们。这意味着我立刻更喜欢前者,因为它输入的次数较少。

RelativeSource的唯一优势是它能够在(例如)广泛使用的风格中自我引用吗?或者是否存在一些额外的语义差异?

3 个答案:

答案 0 :(得分:8)

警告:不是WPF向导

当你直接绑定到WPF元素时,就像在你的例子中一样,没有区别。 “这个”是可解析的,并且会绑定到与Self相同的项目。

我怀疑的是,当您通过Style等结构进行绑定时,区别在于。在这种情况下,您实际想要绑定的是应用样式的元素。在这种情况下,RelativeSource Self将为您提供“this”将为您提供Style实例的元素。

答案 1 :(得分:2)

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

我个人更喜欢参考绑定表单,因为它更容易重构,而且我在设置绑定时不需要移动我的XAML文档来添加元素名称。

答案 2 :(得分:-1)

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