を持っ{Binding ElementName=foo}
ている場合、視覚ツリーまたは論理ツリーを検索しますか?
WPF の論理ツリーとビジュアル ツリーについて | データを見る、データする
論理ツリーが重要になるのはいつですか?
{Binding ElementName=Foo} などで名前を検索すると、継承可能なプロパティの場合と同じように、名前の範囲を検索するために祖先が検索されます。
アタッチされた動作による Silverlight での ElementName バインディング
これを有効にするために、WPF は ElementName および RelativeSource バインディングを提供し、ビジュアル ツリー内の他の要素を見つけてバインドするための強力なメカニズムを提供します。
編集:
によるバインドに使用される論理ツリーのように見えますElementName
。
引数#1。
MSDN の記事FrameworkElement Classによると:
FrameworkElement は UIElement を拡張し、次の機能を追加します。
- データ バインディングと動的リソース参照のサポート: データ バインディングとリソースのプロパティ レベルのサポートは、DependencyProperty クラスによって実装され、プロパティ システムに具体化されますが、式 (プログラミング構造) として格納されているメンバー値を解決する機能データ バインディングと動的リソースの両方の基盤となる) は、FrameworkElement によって実装されます。詳細については、「データ バインディングの概要」および「リソースの概要」を参照してください。
引数#2。
ElementName
を指してx:Name
いるので、この名前は何らかの方法で見つける必要があります。NameScopeの概念があります。
ほとんどのシナリオでは、FrameworkElement および FrameworkContentElement で公開されている FindName メソッドは、名前で要素を検索するために呼び出すより適切なメソッドです。FrameworkElement および FrameworkContentElement によって公開される Name プロパティは、初期名をマークアップ属性として設定するために使用するより適切なプロパティです。また、FrameworkElement および FrameworkContentElement で公開されている RegisterName メソッドは、名前を特定の名前スコープに確立するために必要です (これを直接実行できる NameScope メンバーはありません。RegisterName を使用するには、最初に現在の名前スコープを設定する必要があります)。
一方、Visual クラスにはメソッドがなく、 INameScopeFindName
も実装されていません。