10

従来の {Binding} 構文を使用する場合、要素名を指定してページ上の特定のコントロールを指すことができ、そのプロパティにアクセスできます。たとえば、ページに名前が付けられている場合、次のpageことができます。

{Binding ElementName=Page, Path=Name}

{x:Bind}構文では、

x:Bind では、バインディング式の一部として ElementName=xxx を使用する必要はありません。x:Bind を使用すると、要素の名前をバインディングのパスの最初の部分として使用できます。これは、名前付き要素がルート バインディング ソースを表すページまたはユーザー コントロール内のフィールドになるためです。

したがって、上記の例の {x:Bind} は次のようになります。

{x:Bind page.Name}

これは、データ テンプレート (ListView の ItemTemplate など) 内に収まるまでは正常に機能します。その場合、指定されたデータ型を探しているため機能しなくなりPage、次のエラーが発生します (データ型が であると仮定しますcustomer):

XamlCompiler エラー WMC1110: 無効なバインディング パス 'Page.Name': プロパティ 'Page' が型 'Customer' で見つかりません

データ テンプレートで {x:Bind} 構文を使用し、データ テンプレート外のアクセス コントロールを使用するソリューションは何ですか?

サンプルコードはこちらから入手できます(特定のコミットに注意してください)

4

1 に答える 1

13

この時点で私が知る限り、x:bind メソッドを使用してコントロールのプロパティに直接バインドする方法はありません。これは、バインディング定義内の要素名をサポートしていないためです。

これは、dataTemplate 内のコントロールにバインドできないという意味ではありません。コントロールにアクセスするためにこのようなことを行うことはできますが、コンパイルされたバインド x:Bind 構文を使用することはできません。

 <DataTemplate x:DataType="local:Customer">
     <StackPanel Orientation="Vertical">
         <Button Content="{Binding Name, ElementName=page}" />
         <TextBlock Text="{x:Bind Title}" />
     </StackPanel>        
 </DataTemplate>

エラーが発生する理由は、データ テンプレートがデータ ソースを親にする方法が原因です。x:Bind バインディングはコントロール オブジェクトを参照できず、Customer 型は Page.Name プロパティまたはパスを参照します。上記のように、XAML のみを使用してコントロールの外部にあるユーザー コントロール プロパティにアクセスする唯一の実際の方法は、標準のバインド メカニズムに頼ることです。

これがあなたの質問に答えることを願っています。

于 2015-09-29T18:41:53.840 に答える