web-dev-qa-db-ja.com

x:ReferenceとElementNameの違いは何ですか?

MSDNの x:Reference Markup Extension ページによると、x:Reference

XAMLマークアップの別の場所で宣言されているインスタンスを参照します。参照は、要素のx:Nameを参照します。

MSDNの Binding.ElementNameプロパティ ページによると、ElementName

対象の要素のNameプロパティまたはx:Nameディレクティブの値。

最初のページの備考セクションを振り返る:

x:参照とWPF

WPFおよびXAML 2006では、要素参照はElementNameバインディングのフレームワークレベルの機能によって対処されます。ほとんどのWPFアプリケーションおよびシナリオでは、ElementNameバインディングを引き続き使用する必要があります。この一般的なガイダンスの例外には、データバインディングまたはデータバインディングを非実用的にする他のスコープの考慮事項があり、マークアップのコンパイルが含まれない場合が含まれます。

完全を期すため、ここにElementNameページの備考セクションの一部を示します。

このプロパティは、アプリケーション内の別の要素のプロパティにバインドする場合に役立ちます。たとえば、スライダーを使用してアプリケーション内の別のコントロールの高さを制御する場合、またはコントロールのコンテンツをListBoxコントロールのSelectedValueプロパティにバインドする場合。

今、私はElementNameプロパティをいつ、どのように使用するかを完全に知っていますが、それとx:Referenceマークアップ拡張機能の違いを完全には理解していません。誰でもこれを説明できますか?特に、x:Reference備考セクションから最後の文を展開してください:

この一般的なガイダンスの例外には、データバインディングまたはデータバインディングを非実用的にする他のスコープの考慮事項があり、マークアップのコンパイルが含まれない場合が含まれます。

53
Sheridan

基本的にあなたが言ったように、これら2つはほとんど同じです。ただし、内部には小さな違いがあります。

{x:Reference ...}->は、バインディングが行うような2つのプロパティ間の「ブリッジ」を作成しないオブジェクトの参照のみを返します。その背後には、通常はウィンドウ自体である特定のスコープで特定の名前を検索するサービスが使用されています。

{Binding ElementName="..." }->まず最初にそのバインディングオブジェクトを作成してから、オブジェクト名を検索しますが、x:Referenceと同じ手法を使用して検索しません。 VisualTree内で検索アルゴリズムが上下に移動して、目的の要素を見つけます。したがって、機能的なVisualTreeが常に必要です。例として、非UiElement内で使用した場合、機能しません。最終的に、ビンディングはとどまり、毎日のパンを行います。

これは機能しません:

<StackPanel>
 <Button x:name="bttn1" Visibility="Hidden">Click me</Button>
 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Visibility="{Binding ElementName=bttn1, Path=DataContext.Visibility}"/>
 ....

これは動作します:

<StackPanel>
 <Button x:name="bttn1" Visibility="Hidden">Click me</Button>
 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Visibility="{Binding Source={x:Reference bttn1}, Path=DataContext.Visibility}"/>
 ....

そのような並べ替え:)

60
dev hedgehog

ElementNameはプラットフォーム固有です。つまり使用しているプラ​​ットフォームに基づいて存在する場合と存在しない場合があります。 x:Referenceは、その概念をXAMLネイティブ機能に高めます。したがって、XAMLをサポートするプラットフォームはすべてx:Referenceをサポートします。

3
Michael Brown