基本的に、同じ名前のスコープにいる必要があります(これを読んでください)。ほとんどの UI 要素は、同じ名前スコープを共有する同じツリーにありますが、ブレークやバリア (スタイル/テンプレート) が存在する可能性があり、DataGrid
列のような抽象オブジェクトがある場合、それらには名前スコープがまったくありません。
いつ問題が発生するかを推測するのに十分な長さで WPF を使用してきました。一般的な領域は知っていますが、すべての状況で前もって簡単に判断できる方法はないと思います。
これが true の場合、Binding ElementName はテンプレートでまったく機能しないということではないでしょうか? しかし、テンプレート内の ElementName にいくつかの有効なバインディングが確実にあります。
内は問題ありません。それは同じスコープです。ここでのポイントは、テンプレートを適用すると、独自のスコープがないと競合が発生するということです。
例えば
<Button/>
<Button/>
を展開すると、次のControlTemplate
ようになります。
<Border Name="bd" Background="{TemplateBinding Background}">...</Border>
<Border Name="bd" Background="{TemplateBinding Background}">...</Border>
明らかに、名前の競合が発生します。
の場合も同様です。テンプレートでコントロールに名前を付けると、その名前は他のアイテムの適用されたテンプレートで同じコントロール インスタンスと競合しDataTemplates
ます。ItemsControls
別の注意として、論理的にその名前を持つインスタンスは 1 つしか存在できないため、テンプレートの内側から外側にバインドできます。または、名前のスコープがどれだけ「近い」かに基づいて、それらに明確な優先順位を与えることができます。
<TextBox Name="tb" Text="Test"/>
<ItemsControl ItemsSource="ABC">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text, ElementName=tb}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>