基本上你需要在同名范围内(阅读这个)。大多数 UI 元素在同一棵树中共享相同的名称范围,但是可能存在中断和障碍(样式/模板),如果您有像DataGrid
列这样的抽象对象,它们根本没有名称范围。
我一直在使用 WPF 足够长的时间来猜测我什么时候会遇到问题,并且我知道公共区域,但不认为有一种简单的方法可以预先判断所有情况。
如果这是真的,那是否意味着 Binding ElementName 根本不应该在模板中工作?但是,我的模板中肯定有一些对 ElementName 的有效绑定。
内就好了,这是相同的范围。这里的要点是,如果您应用模板并且它们没有自己的范围,则会发生冲突。
例如
<Button/>
<Button/>
如果我们扩展ControlTemplate
你会得到类似的东西:
<Border Name="bd" Background="{TemplateBinding Background}">...</Border>
<Border Name="bd" Background="{TemplateBinding Background}">...</Border>
显然我们会遇到名称冲突。
DataTemplates
in相同ItemsControls
,如果您在模板中命名控件,该名称将与其他项目的应用模板中的相同控件实例冲突。
另一方面,您可以从模板内部绑定到外部,因为逻辑上只能有一个具有该名称的实例,或者您可以根据名称范围的“接近”程度为它们赋予不同的优先级,例如
<TextBox Name="tb" Text="Test"/>
<ItemsControl ItemsSource="ABC">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text, ElementName=tb}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>