<Window
x:Name="Me"
x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:WpfApplication1"
Title="MainWindow">
<StackPanel>
<TextBlock Text="{Binding Title, ElementName=Me}"/>
<TextBlock Text="{Binding Title, RelativeSource={RelativeSource AncestorType={x:Type src:MainWindow}}}"/>
</StackPanel>
</Window>
我相信当TextBlocks嵌套层级很高并且拥有许多兄弟和祖先时,我的问题可能会有所不同。
注意事项
(仅基于个人想法,每个特定的想法可能都是错误的!):
ElementName
:- 可能会通过所有子元素、同级元素、叔叔和曾祖父(可能存在所有已注册名称的哈希表)将当前元素与更多控件进行搜索和比较,包括祖先。
- 获取控件的
Name
属性应该比调用GetType
更具有性能优势。 - 与比较类型相比,比较字符串更加便宜,特别是当您知道大多数控件甚至没有设置它们的
Name
时。
FindAncestor
:- 只会迭代祖先,而不是兄弟姐妹、叔叔阿姨等。
- 最可能使用
GetType
来确定祖先类型;GetType的成本比简单的Name
属性getter更高(也许DP不同?)。
ElementName
和RelativeSource
):请记住,ElementName
是**'早期绑定',而RelativeSource
是'延迟绑定'**,这可能会导致意外的结果,就像我在这个问题中展示的那样:https://dev59.com/4HbZa4cB1Zd3GeqPBQ_r。 - lxa