2009-04-01 3 views
20

{Binding ElementName=foo}を持つと、ビジュアルツリーまたは論理ツリーが検索されますか?論理ツリー状物質を行いバインディングElementName。ビジュアルツリーまたは論理ツリーを使用しています

Of logical and visual trees in WPF | Data See, Data Do

よう{バインディングのElementName =フー}のように、名前を検索する場合、検索 それは 継承プロパティの場合と同じように、再び、 名前スコープを探し祖先を歩きます。

ElementName binding in Silverlight via Attached Behaviours

これを可能にするために、WPFは

にバインドするために、あなたのビジュアルツリー内の他の要素を 見つけるためにあなたに強力な メカニズムを与え、 のElementNameおよびRelativeSource バインディングを提供します

編集:

バインドに使用される論理ツリーのように見えます(ElementName)。 MSDNの記事FrameworkElement Classによる

引数#1

のFrameworkElementは、UIElementの を拡張し、次の機能が追加されます:データバインディングと 動的リソース参照の

  • サポート:バインディングとリソースの データに対する のプロパティレベルのサポート によって実装されたDependencyPropertyクラスによって とプロパティシステムにおいて具現 が、 式(結合 両方のデータと動的 リソースの下 プログラミングコンストラクト)として記憶されるメンバ値を 解決する能力を実現FrameworkElement。 の詳細については、データバインディングの概要 およびリソースの概要を参照してください。

引数#2

ElementNamex:Nameのポイントなので、この名前にはいくつかの方法が見つかるはずです。 NameScopeのコンセプトがあります。ほとんどのシナリオで

、FrameworkElementの とFrameworkContentElementの上に露出しFindName指定 方法は、名前で要素のため を検索するために呼び出すために、より 適切な方法です。名前 FrameworkElement およびFrameworkContentElementによって公開されるプロパティは、 のマークアップ属性として、 を設定するために使用する適切なプロパティです。 そしてRegisterNameメソッドはFrameworkElementの上 を露出し、 FrameworkContentElementのは、特定の 名前スコープに名前を確立する を必要である(直接これを行うことができます何のNameScopeの メンバーはありません。あなたが RegisterNameを使用することを第一の電流名前スコープ を設定する必要があります) 。一方

Visual classどちらも FindNameメソッドを持っていない、また INameScopeを実装します。

+0

論理ツリーが使用されます。後者は詳細を投稿します。 – alex2k8

答えて

6

論理ツリーだと思います。 ControlTemplatesを使用すると、ある視覚ツリーを別の視覚ツリーに置き換えることになりますが、ControlTemplate内で定義された名前を参照することはできません。例えば

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <Grid.Resources> 
      <ControlTemplate x:Key="Foo" TargetType="Button"> 
       <Border x:Name="border" Background="Red"> 
        <Label Content="{TemplateBinding Content}"></Label> 
       </Border> 
      </ControlTemplate> 
     </Grid.Resources> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition></ColumnDefinition> 
      <ColumnDefinition></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Button x:Name="buttonFoo" Background="Green" HorizontalAlignment="Center" VerticalAlignment="Center" Template="{DynamicResource Foo}">Foo</Button> 
     <Label x:Name="labelBar" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Background="{Binding ElementName=border, Path=Background}">Bar</Label> 
    </Grid> 
</Page> 

はのControlTemplateに「国境」という名前の要素を見つけることができませんが、予想通りlabelBarの結合「buttonFoo」の中のElementNameを変更すると、背景グリーンになります。

0

意味での結合ElementNameプロパティ1は、XAMLで論理ツリーにのみ、特定の制御を占うためにElementNameを使用しているため、論理ツリーの外に動作し(答下記参照)。

視覚的または論理的なツリーを検索しますか?あなたが提案する前提が間違っている

は、どちらかの木の上、それ自体は何の検索はありません。論理ツリーの継承されたDataContextにデフォルト設定するのではなく、バインディングで使用されるリフレクション操作のプロパティをソースに設定するだけです。

1は、Binding.ElementName Property (System.Windows.Data)(太字鉱山)のドキュメントを読み込む場合:...

を」のElementNameプロパティが明示的バインディングのソースを設定することができる方法の一つであり、継承されたデータを上書きしますコンテキスト。"

ソースにアクセスしてから反射することができ、現在の操作の名前空間内にある任意のインスタンス化オブジェクトあります。

人物 Xamlには論理的な項目がありますが、視覚的なツリーにも存在する可能性があるため、Logical Treeにはこれ以上ありません。


は、詳細はData Binding Overviewを参照してください。

関連する問題