2013-08-22 23 views
6

私は数週間前に、テンプレートの中で動作しないことがありました。最近、2つの異なるウィンドウでバインドしようとしましたが、名前の宣言が見つかりませんでした。代わりにdatacontextを設定するだけでバインドされます。しかし、私が本当に興味があるのは、bindingnameを使うことができて、それができない時には、私は本当に好きです。bindingnameはどのように正確に動作しますか?

編集:オブジェクトツリースタイルやテンプレートで、このような理由から」

スタイルとテンプレートの両方、独自のXAML名前スコープを定義し、どのような場所に依存しない:その記事を読んで、私はこれは興味深いことが判明適用されます。

これが真であれば、Binding ElementNameはテンプレートでは全く機能しないはずですか?しかし、私は間違いなく私のテンプレート内のElementNameにいくつかのワーキングバインディングを持っています。それは最も混乱しやすい部分ですが、バインディングの中にはテンプレート内でランダムに動作するのはなぜですか?テンプレートや同じ名前スコープに名前がなくても名前を解決しようとする方法が必要です

+1

'ElementName'のみ結合た名前スコープ同じ[NameScopeの(http://msdn.microsoft.com/en-us/library/ms746659.aspx) –

+0

の要素のために働きますか?これらのような : のxmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" のxmlns:X = "http://schemas.microsoft.com/winfx/2006/xaml" しかし、もしそれらの2つだけであれば、私のファイルのすべてがそれらを持っているので、ElementNameを使ってすべてを参照することができます。 –

+1

これは 'Namescope'ではなく' Namespace'です。それらは2つの異なる概念です。 'Namespace'は' XML'コンセプト、 'Namescope'はXAMLコンセプトです。 –

答えて

12

基本的に同じname scope(これをお読みください)にする必要があります。ほとんどのUI要素は同じ名前のスコープを共有する同じツリーにありますが、ブレークとバリア(スタイル/テンプレート)があり、DataGridというような抽象オブジェクトがある場合、名前スコープはまったくありません。

私は、問題に遭遇し、共通の領域を知っているが、すべての状況を先験的に伝える簡単な方法はないと思うほど、WPFで十分に作業してきました。


これが本当であれば、それはバインディングのElementNameが全くテンプレートで動作してはならないという意味ではありませんか?しかし、私は間違いなく私のテンプレート内のElementNameにいくつかのワーキングバインディングを持っています。

内は同じスコープです。ここでのポイントは、テンプレートを適用して独自のスコープを持たない場合、競合が発生することです。

<Button/> 
<Button/> 

我々はControlTemplateを展開すると、あなたのようなものになるだろう。もちろん、我々は名前の競合になるだろう

<Border Name="bd" Background="{TemplateBinding Background}">...</Border> 
<Border Name="bd" Background="{TemplateBinding Background}">...</Border> 

を。

DataTemplatesと同じItemsControlsのテンプレートに名前を付けると、その名前が他のアイテムのテンプレートに適用された同じコントロールインスタンスと競合することになります。別のノートで


、論理的にのみ、その名前を持つつのインスタンスが存在する可能性があるため、あなたが外にテンプレート内からバインドすることができたり、「クローズ」の名前のスコープがあるかに基づいて、彼らに明確な優先権を与えることができます、例えば

<TextBox Name="tb" Text="Test"/> 
<ItemsControl ItemsSource="ABC"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Text, ElementName=tb}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

* DataGrid列などの抽象オブジェクトは特別なものになるのはなぜですか?それはビジュアルツリーに関連していますか? – McGarnagle

+0

したがって、ツリー内のいくつかのアイテムが同じ名前スコープを持たない場合、同じ名前スコープを持っていても名前は将来のアイテムに伝播しませんか? –

+0

@McGarnagle:はい、彼らはどんなツリーにもありません。 –

関連する問題