70

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完全を期すために、ページの備考セクションの一部を次に示します。

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

現在、このプロパティをいつどのように使用するかについては十分に認識していますが、プロパティとマークアップ拡張機能ElementNameの違いを完全には理解していません。x:Reference誰かこれについて説明してください。特に、x:Reference備考欄の最後の文を詳しく説明してください。

この一般的なガイダンスの例外には、データ コンテキストやその他のスコープに関する考慮事項があり、データ バインディングが非現実的であり、マークアップ コンパイルが関与しない場合が含まれる場合があります。

4

2 に答える 2

77

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

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

{Binding ElementName="..." }-> まず、そのバインディング オブジェクトを作成し、次にオブジェクト名を検索しますが、内部で x:Reference と同じ手法を使用するわけではありません。検索アルゴリズムは、VisualTree 内を上下に移動して、目的の要素を見つけます。したがって、機能的な VisualTree が常に必要です。たとえば、Non-UiElement 内で使用すると機能しません。最後に、Binding は残り、日々の糧を提供します。

これはうまくいきません:

<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}"/>
 ....

そのような並べ替え:)

于 2013-10-08T10:14:48.833 に答える
3

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

于 2016-12-27T21:28:41.050 に答える