13

数週間前に、テンプレート内で機能しないことがあると読んだことを覚えています。最近、2 つの異なるウィンドウでバインドしようとしたところ、名前宣言が見つからなかったので、名前空間のローカルであると想定しました。代わりにデータコンテキストを設定することでバインドされます。しかし、バインド要素名を使用できる場合と使用できない場合は非常に興味があります。可能な場合ははるかに便利だからです。

編集:その記事を読んで、これが興味深いことに気づきました:

「このため、スタイルとテンプレートはどちらも、スタイルまたはテンプレートが適用されるオブジェクト ツリー内の場所に関係なく、独自の XAML 名前スコープを定義します。」

これが true の場合、Binding ElementName はテンプレートでまったく機能しないということではないでしょうか? しかし、テンプレート内の ElementName にいくつかの有効なバインディングが確実にあります。これが最も紛らわしい部分です。テンプレート内でランダムに動作するバインディングとそうでないバインディングがあるのはなぜですか? テンプレートまたは同じ名前スコープにない場合でも、名前を解決しようとする何らかの方法が必要です。

4

1 に答える 1

17

基本的に、同じ名前のスコープにいる必要があります(これを読んでください)。ほとんどの 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>
于 2013-08-22T19:26:07.103 に答える