通过名称进行绑定自引用与通过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的唯一优势是它能够在(例如)广泛使用的风格中自我引用吗?或者是否存在一些额外的语义差异?
答案 0 :(得分:8)
警告:不是WPF向导
当你直接绑定到WPF元素时,就像在你的例子中一样,没有区别。 “这个”是可解析的,并且会绑定到与Self相同的项目。
我怀疑的是,当您通过Style等结构进行绑定时,区别在于。在这种情况下,您实际想要绑定的是应用样式的元素。在这种情况下,RelativeSource Self将为您提供“this”将为您提供Style实例的元素。
答案 1 :(得分:2)
如果您倾向于重构控件的名称,那么使用自我复制形式可能更为可取,否则我会说这是我根据性能做出的调用。构造一个小测试,看看哪种类型的绑定表现更好,然后选择那个。如果性能差异可以忽略不计,那么我肯定会考虑其他可维护性因素,例如整体外观和打字时间。另外不要忘记,在使用自引用表单时,您不必为元素命名,因此在比较鼠标和键盘之间的键入和上下文切换量时,必须包含ElementName表单的额外命名要求。
我个人更喜欢参考绑定表单,因为它更容易重构,而且我在设置绑定时不需要移动我的XAML文档来添加元素名称。
答案 2 :(得分:-1)
为什么你认为它们之间存在差异?我认为它们应该是相同的,因为它们是引用相同元素的两种方式。