次の方法で共有


{x:Bind} マークアップ拡張

手記{x:Bind} でアプリでデータ バインディングを使用する方法 (および {x:Bind} と {Binding} の間の詳細な比較) の一般的な情報については、「データ バインディングの詳細」を参照してください。

{x:Bind} マークアップ拡張機能 (Windows 10 の新機能) は、{Binding} の代わりに使用できます。 {x:Bind} は{Binding} よりも短時間で実行され、メモリが少なくなり、デバッグが向上します。

XAML コンパイル時に、 {x:Bind} はデータ ソースのプロパティから値を取得し、マークアップで指定されたプロパティに設定するコードに変換されます。 必要に応じて、データ ソース プロパティの値の変更を観察し、それらの変更 (Mode="OneWay") に基づいて自身を更新するようにバインディング オブジェクトを構成できます。 必要に応じて、独自の値の変更をソース プロパティ (Mode="TwoWay") にプッシュするように構成することもできます。

{x:Bind}{Binding} によって作成されるバインド オブジェクトは、ほぼ機能的に同等です。 ただし 、{x:Bind} は コンパイル時に生成される特殊な目的のコードを実行し、 {Binding} は 汎用ランタイム オブジェクト検査を使用します。 したがって、 {x:Bind} バインド (コンパイル済みバインディングと呼ばれることが多い) は、優れたパフォーマンスを発揮し、バインド式のコンパイル時検証を提供し、ページの部分クラスとして生成されるコード ファイルにブレークポイントを設定できるようにすることでデバッグをサポートします。 これらのファイルは、(C# の場合) objのような名前で、<view name>.g.cs フォルダーにあります。

ヒント

{x:Bind} には、既定のモードが OneWay である {Binding} とは異なり、 OneTime の既定のモードがあります。 これは、OneWay を使用すると、変更検出をフックアップして処理するために生成されるコードが増えるので、パフォーマンス上の理由から選択されました。 OneWay または TwoWay バインドを使用するモードを明示的に指定できます。 また、x:DefaultBindMode を使用して、マークアップ ツリーの特定のセグメントの {x:Bind} の既定のモードを変更することもできます。 指定されたモードは、バインドの一部としてモードを明示的に指定しない、その要素とその子に対する {x:Bind} 式に適用されます。

XAML 属性の使用方法

<object property="{x:Bind}" .../>
-or-
<object property="{x:Bind propertyPath}" .../>
-or-
<object property="{x:Bind bindingProperties}" .../>
-or-
<object property="{x:Bind propertyPath, bindingProperties}" .../>
-or-
<object property="{x:Bind pathToFunction.functionName(functionParameter1, functionParameter2, ...), bindingProperties}" .../>
任期 Description
propertyPath バインディングのプロパティ パスを指定する文字列。 詳細については、以下の 「プロパティ パス」 セクションを参照してください。
bindingProperties
propName=value[, propName=value]* 名前と値のペア構文を使用して指定される 1 つ以上のバインド プロパティ。
propName バインド オブジェクトに設定するプロパティの文字列名。 たとえば、"Converter" などです。
value プロパティを設定する値。 引数の構文は、設定されているプロパティによって異なります。 値自体がマークアップ拡張である propName=value 使用法の例を次に示します: Converter={StaticResource myConverterClass}。 詳細については、以下の 「{x:Bind} 」セクションで設定できるプロパティ を参照してください。

例示

<Page x:Class="QuizGame.View.HostView" ... >
    <Button Content="{x:Bind Path=ViewModel.NextButtonText, Mode=OneWay}" ... />
</Page>

この XAML の例では、ListView.ItemTemplate プロパティで {x:Bind} を使用します。 x:DataType 値の宣言に注意してください。

  <DataTemplate x:Key="SimpleItemTemplate" x:DataType="data:SampleDataGroup">
    <StackPanel Orientation="Vertical" Height="50">
      <TextBlock Text="{x:Bind Title}"/>
      <TextBlock Text="{x:Bind Description}"/>
    </StackPanel>
  </DataTemplate>

プロパティ パス

PropertyPath、{x:Bind} 式のパスを設定します。 Path は、バインド先のプロパティ、サブプロパティ、フィールド、またはメソッド (ソース) の値を指定するプロパティ パスです。 Path プロパティの名前は明示的に指定できます:{x:Bind Path=...}。 または、省略できます: {x:Bind ...}

プロパティ パスの解決

{x:Bind}DataContext を既定のソースとして使用しません。代わりに、ページまたはユーザー コントロール自体を使用します。 したがって、ページまたはユーザー コントロールのコードビハインドで、プロパティ、フィールド、およびメソッドを確認します。 ビュー モデルを {x:Bind} に公開するには、通常、ページまたはユーザー コントロールの分離コードに新しいフィールドまたはプロパティを追加します。 プロパティ パスのステップはドット (.) で区切られ、複数の区切り記号を含めることで、連続するサブプロパティを走査できます。 バインドされるオブジェクトを実装するために使用されるプログラミング言語に関係なく、ドット区切り記号を使用します。

たとえば、ページ内で Text="{x:Bind Employee.FirstName}" は、ページ上で Employee メンバーを検索し、次に Employee によって返されるオブジェクトの FirstName メンバーを検索します。 アイテム コントロールを従業員の依存を含むプロパティにバインドする場合、プロパティ パスは "Employee.Dependents" になり、アイテム コントロールの項目テンプレートが "Dependents" にアイテムを表示する処理を行います。

C++/CX の場合、 {x:Bind} は ページまたはデータ モデルのプライベート フィールドとプロパティにバインドできません。バインド可能にするにはパブリック プロパティが必要です。 関連するメタデータを取得できるように、バインディングのサーフェス領域を CX クラス/インターフェイスとして公開する必要があります。 [Bindable] 属性は必要ありません。

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

Collections

データ ソースがコレクションの場合、プロパティ パスはコレクション内の項目を位置またはインデックスで指定できます。 たとえば、「Teams[0].Players」のように、リテラルの「[]」は 0 という数字を囲み、インデックスが 0 から始まるコレクションの最初の項目を要求します。

インデクサーを使用するには、インデックスを作成するプロパティの型に IList<T> または IVector<T> を実装する必要があります。 (IReadOnlyList に注意してください<T> および IVectorView<T> はインデクサー構文をサポートしていません。インデックス付きプロパティの型が INotifyCollectionChanged または IObservableVector をサポートしていて、バインディングが OneWay または TwoWay の場合、それらのインターフェイスで変更通知を登録してリッスンします。 変更検出ロジックは、特定のインデックス付き値に影響を与えない場合でも、すべてのコレクションの変更に基づいて更新されます。 これは、リッスン ロジックがコレクションのすべてのインスタンスで共通であるためです。

データ ソースが Dictionary または Map の場合、プロパティ パスは文字列名でコレクション内の項目を指定できます。 たとえば、<TextBlock Text="{x:Bind Players['John Smith']}" /> は、"John Smith" という名前の辞書内の項目を検索します。 名前は引用符で囲む必要があり、単一引用符または二重引用符を使用できます。 Hat (^) を使用すると、文字列内の引用符をエスケープできます。 通常、XAML 属性に使用される代替引用符を使用するのが最も簡単です。 (IReadOnlyDictionary<T> および IMapView<T> はインデクサー構文をサポートしていません。)

文字列インデクサーを使用するには、インデックスを作成するプロパティの型に IDictionary<string、T>IMap<string、T> を実装する必要があります。 インデックス付きプロパティの型が IObservableMap を サポートしていて、バインディングが OneWay または TwoWay の場合、それらのインターフェイスで変更通知を登録してリッスンします。 変更検出ロジックは、特定のインデックス付き値に影響を与えない場合でも、すべてのコレクションの変更に基づいて更新されます。 これは、リッスン ロジックがコレクションのすべてのインスタンスで共通であるためです。

添付プロパティ

添付プロパティにバインドするには、クラスとプロパティ名をドットの後にかっこで囲む必要があります。 たとえば Text="{x:Bind Button22.(Grid.Row)}"。 プロパティが Xaml 名前空間で宣言されていない場合は、xml 名前空間のプレフィックスを付ける必要があります。この名前空間は、ドキュメントの先頭にあるコード名前空間にマップする必要があります。

キャスティング

コンパイルされたバインドは厳密に型指定され、パス内の各ステップの型が解決されます。 返された型にメンバーがない場合、コンパイル時に失敗します。 キャストを指定して、バインディングがオブジェクトの実際の型を認識するように指示できます。

次の場合、obj はオブジェクト型のプロパティですが、テキスト ボックスが含まれているため、Text="{x:Bind ((TextBox)obj).Text}" または Text="{x:Bind obj.(TextBox.Text)}" を使用できます。

groups3 フィールド Text="{x:Bind ((data:SampleDataGroup)groups3[0]).Title}" はオブジェクトのディクショナリであるため、data:SampleDataGroup にキャストする必要があります。 既定の XAML 名前空間の一部ではないコード名前空間にオブジェクト型をマッピングするための xml データ 名前空間プレフィックスの使用に注意してください。

注: C#スタイルのキャスト構文は、添付プロパティ構文よりも柔軟性が高く、今後推奨される構文です。

パスを使用しないキャスティング

ネイティブ バインド パーサーは、 this を関数パラメーターとして表すキーワードを提供しませんが、パスレス キャスト ( {x:Bind (x:String)} など) をサポートしています。これは関数パラメーターとして使用できます。 したがって、 {x:Bind MethodName((namespace:TypeOfThis))} は、概念的に {x:Bind MethodName(this)}と同等なものを実行する有効な方法です。

例:

Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}"

<Page
    x:Class="AppSample.MainPage"
    ...
    xmlns:local="using:AppSample">

    <Grid>
        <ListView ItemsSource="{x:Bind Songs}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:SongItem">
                    <TextBlock
                        Margin="12"
                        FontSize="40"
                        Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>
namespace AppSample
{
    public class SongItem
    {
        public string TrackName { get; private set; }
        public string ArtistName { get; private set; }

        public SongItem(string trackName, string artistName)
        {
            ArtistName = artistName;
            TrackName = trackName;
        }
    }

    public sealed partial class MainPage : Page
    {
        public List<SongItem> Songs { get; }
        public MainPage()
        {
            Songs = new List<SongItem>()
            {
                new SongItem("Track 1", "Artist 1"),
                new SongItem("Track 2", "Artist 2"),
                new SongItem("Track 3", "Artist 3")
            };

            this.InitializeComponent();
        }

        public static string GenerateSongTitle(SongItem song)
        {
            return $"{song.TrackName} - {song.ArtistName}";
        }
    }
}

バインド パス内の関数

Windows 10 バージョン 1607 以降、 {x:Bind} では 、バインド パスのリーフ ステップとして関数を使用できます。 これは、マークアップ内のいくつかのシナリオを可能にするデータ バインドの強力な機能です。 詳細については、 関数バインドを 参照してください。

イベント バインド

イベント バインディングは、コンパイル済みバインドの一意の機能です。 これにより、分離コードのメソッドである必要はなく、バインディングを使用してイベントのハンドラーを指定できます。 例: Click="{x:Bind rootFrame.GoForward}"

イベントの場合、ターゲット メソッドをオーバーロードする必要はありません。また、次のことも行う必要があります。

  • イベントのシグネチャと一致します。
  • またはパラメーターを指定しません。
  • または、イベント パラメーターの型から割り当て可能な型のパラメーターの数が同じです。

生成された分離コードでは、コンパイルされたバインドによってイベントが処理され、モデル上のメソッドにルーティングされ、イベントが発生したときにバインディング式のパスが評価されます。 つまり、プロパティ バインドとは異なり、モデルへの変更は追跡されません。

プロパティ パスの文字列構文の詳細については、{x:Bind} に関してここで説明されている相違点に留意して、プロパティ パス構文を参照してください。

{x:Bind} で設定できるプロパティ

マークアップ拡張機能で設定できる複数の読み取り/書き込みプロパティがあるため、{x:Bind}bindingProperties プレースホルダー構文で示されています。 プロパティは、コンマ区切りの propName=value ペアを使用して任意の順序で設定できます。 バインド式に改行を含めることはできません。 一部のプロパティには型変換がない型が必要であるため、 {x:Bind} 内で入れ子になった独自のマークアップ拡張が必要です。

これらのプロパティは、 Binding クラスのプロパティとほぼ同じように機能します。

プロパティ Description
パス 上記の 「プロパティ パス」 セクションを参照してください。
コンバータ バインディング エンジンによって呼び出されるコンバーター オブジェクトを指定します。 コンバーターは XAML で設定できますが、リソース ディクショナリ内のそのオブジェクトへの {StaticResource} マークアップ拡張 参照で割り当てたオブジェクト インスタンスを参照する場合にのみ設定できます。
ConverterLanguage コンバーターで使用するカルチャを指定します。 ( ConverterLanguage を 設定する場合は、 Converter も設定する必要があります)。カルチャは標準ベースの識別子として設定されます。 詳細については、「 ConverterLanguage」を参照してください。
ConverterParameter コンバーター ロジックで使用できるコンバーター パラメーターを指定します。 ( ConverterParameter を設定する場合は、 Converter も設定する必要があります)。ほとんどのコンバーターは、変換に渡された値から必要なすべての情報を取得する単純なロジックを使用し、 ConverterParameter 値は必要ありません。 ConverterParameter パラメーターは、ConverterParameter で渡された内容をキーオフする複数のロジックを持つ、中程度に高度なコンバーター実装用です。 文字列以外の値を使用するコンバーターを記述できますが、これは一般的ではありません。詳細については、 ConverterParameter の「解説」を参照してください。
FallbackValue ソースまたはパスを解決できない場合に表示する値を指定します。
モード バインド モードを、"OneTime"、"OneWay"、または "TwoWay" のいずれかの文字列として指定します。 既定値は "OneTime" です。 これは、{ Binding} の既定値 (ほとんどの場合は "OneWay") とは異なります。
TargetNullValue ソース値が解決されるが明示的に null の場合に表示する値を指定します。
BindBack 双方向バインディングの逆方向に使用する関数を指定します。
UpdateSourceTrigger TwoWay バインドでコントロールからモデルに変更をプッシュバックするタイミングを指定します。 TextBox.Text を除くすべてのプロパティの既定値は PropertyChanged です。TextBox.Text は LostFocus です。

マークアップを {Binding} から {x:Bind} に変換する場合は、Mode プロパティの既定値の違いに注意してください。 x:DefaultBindMode を使用して、マークアップ ツリーの特定のセグメントの x:Bind の既定のモードを変更できます。 選択したモードは、バインドの一部としてモードを明示的に指定しない、その要素とその子に x:Bind 式を適用します。 OneWay を使用すると、変更検出をフックアップして処理するために生成されるコードが増えるので、OneTime の方が OneWay よりもパフォーマンスが高くなります。

注釈

{x:Bind} は生成されたコードを使用してその利点を実現するため、コンパイル時に型情報が必要です。 これは、型が事前にわからないプロパティにバインドできないことを意味します。 このため、Object 型の DataContext プロパティと共に {x:Bind} を使用することはできません。また、実行時に変更される可能性もあります。

データ テンプレートで {x:Bind} を 使用する場合は、「例」セクションに示すように x:DataType 値を設定して、バインドされる型を指定 する 必要があります。 また、型をインターフェイスまたは基底クラスの型に設定し、必要に応じてキャストを使用して完全な式を作成することもできます。

コンパイルされたバインドは、コードの生成によって異なります。 そのため、リソース ディクショナリで {x:Bind} を 使用する場合、リソース ディクショナリには分離コード クラスが必要です。 コード例については、 {x:Bind} のリソース ディクショナリ を参照してください。

コンパイル済みバインドを含むページとユーザー コントロールには、生成されたコードに "Bindings" プロパティが含まれます。 これには、次のメソッドが含まれます。

  • Update() - これにより、コンパイルされたすべてのバインディングの値が更新されます。 一方向/双方向バインディングでは、変更を検出するためにリスナーが設定されます。
  • Initialize() - バインドがまだ初期化されていない場合は、Update() を呼び出してバインディングを初期化します
  • StopTracking() - これにより、一方向と双方向のバインド用に作成されたすべてのリスナーのフックが解除されます。 これらは、Update() メソッドを使用して再初期化できます。

Windows 10 バージョン 1607 以降、XAML フレームワークにはブール型から可視性へのコンバーターが組み込まれています。 コンバーターは TrueVisible 列挙値に、 false をCollapsed にマップするため、コンバーターを作成せずに Visibility プロパティをブール値にバインドできます。 これは関数バインドの機能ではなく、プロパティ バインドのみであることに注意してください。 組み込みのコンバーターを使用するには、アプリの最小ターゲット SDK バージョンが 14393 以降である必要があります。 アプリが以前のバージョンの Windows 10 を対象とする場合は使用できません。 ターゲット バージョンの詳細については、「 バージョン アダプティブ コード」を参照してください。

ヒント

PathConverterParameter など、値に 1 つの中かっこを指定する必要がある場合は、その前に円記号 (\{) を付けます。 または、エスケープが必要な中かっこを含む文字列全体を 2 次引用符セットで囲みます (例: ConverterParameter='{Mix}')。

ConverterConverterLanguageConverterLanguage はすべて、バインディング ソースからバインディング ターゲット プロパティと互換性のある型または値に値または型を変換するシナリオに関連しています。 詳細と例については、「データ バインディングの詳細」の「データ変換」セクション を参照してください

{x:Bind} はマークアップ拡張のみで、そのようなバインドをプログラムで作成または操作する方法はありません。 マークアップ拡張機能の詳細については、「XAML の 概要」を参照してください。