日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。appでは、従来のデータバインディングに加えてコンパイル時データバインディングというものが追加されています。コンパイル時データバインディングは、名前の通り従来は実行時にやっていた色々な処理をコンパイル時に行ってしまうというものです。これにより、データバインディングを多用するアプリ(XAML系アプリケーションの場合は大体そうですよね)での性能向上が見込めます。シンプルなデータバインドコンパイル時データバインディングを使う上で大きく異なる点が2つあります。...}というものを使うという点です。2つ目がPathの起点となるのが従来のデータバインディングではDataContextプロパティだったのが、コンパイル時データバインディングではPageを起点とする点です。実際にやってみたいと思います。SimpleBindingというアプリケーションを作って単純なプロパティを持っただけのシンプルなViewModelを作成します。}}そして、MainPageクラスに以下のようにViewModelという名前(名前はなんでもいいです)のプロパティを作ります。それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。}}そして、このViewModelプロパティを指定してXAMLでバインドします。</Grid></Page>実行すると以下のようになります。Modeの違い次にコンパイル時データバインディングが従来のデータバインディングと異なる点は、Modeのデフォルト値です。従来のデータバインディングがOneWayがデフォルトだったのに対してコンパイル時データバインディングは、OneTimeがデフォルトになります。このため、INotifyPropertyChangedを実装したプロパティをバインドしても、値の変更は画面に反映されません。実際にOneWayBindingというプロジェクトを作って試してみます。このようにINotifyPropertyChangedを実装したViewModelを作成します。}}そして、MainPageクラスにViewModelというプロパティで使えるようにします。それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。}}そして、以下のように、デフォルトのままのx:BindとModeをOneWayにしたx:Bindを指定したTextBlockを並べます。</StackPanel></Page>ボタンのクリックイベントハンドラでNameプロパティを書き換えます。それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。}}実行すると以下のようになります。ボタンを押すと、以下のようにOneWayを指定したほうだけデータが書き換わるのがわかります。コントロールのバインディング従来のバインディングでElementNameを指定していたコントロールのバインディングは、Pathにコントロール名を直接指定するだけでいいようになっています。Pathの起点がページなので当然の動作といえば当然の動作ですね。ControlBindingという名前のプロジェクトを作って動作を見てみます。SliderとTextBlockを置いて、Sliderの値とTextBlockのTextをバインドしています。</StackPanel></Page>ポイントはSliderにx:Nameで名前を付けている点と、その名前を使ってTextBlockでバインドしている点になります。実行すると以下のようにSliderの値とTextBlockの値が連動していることがわかります。イベントのバインディングコンパイル時バインディングでは、イベントのバインドも行えるようになっています。ButtonのClickイベントをViewModelにバインドする場合は以下のように行えます。EventBindingという名前のプロジェクトを作って以下のようなViewModelを作成します。イベントに紐づけできるメソッドは、引数無しと、object型の引数が2つあるものと、普通のイベントハンドラの形の引数のものの3パターンがあります。}}PageにViewModelプロパティを定義します。それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。}}そして、XAMLでViewModelのイベントにバインドします。イベントの指定の仕方は単純にイベントへのパスを指定するだけです。</StackPanel></Page>実行してボタンをクリックするとメッセージボックスが表示されます。TextBoxのバインディングTextBoxのTextプロパティは特別扱いされています。ほかのプロパティが値が変わったタイミングで変更が入るのに対して、TextBoxのTextプロパティはフォーカスが外れたタイミングで値が変わります。TextBoxBindingというプロジェクトを作ってTextBoxとTextBlockの間をTwoWayバインディングをします。TwoWayバインディングのほかの注意点としては、依存関係プロパティじゃないとダメという点があったりします。</StackPanel></Page>実行して動作を確認します。文字を打ち込んだだけの時点ではTextBlockに変更が反映されません。フォーカスを外すと変更が反映されます。コレクションのバインディングItemsSourceプロパティにコレクションをバインドすることでコレクションのバインドもできます。CollectionBindingというプロジェクトを作って以下のようなコレクションに表示する項目を表すクラスを作ります。}}そして、Personクラスのコレクションを持ったMainPageViewModelクラスを作ります。}}MainPageクラスにViewModelプロパティを追加します。それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。}}そして、ListBoxなどのコレクションを表示するコントロールのItemsSourceにコレクションをバインドします。このとき、データを表示するためのDataTemplateを指定することがほとんどだと思いますが、DataTemplate内でコンパイル時バインディングを使うにはx:DataType属性でDataTemplateに表示される型を指定する必要があります。ListBoxにViewModelのPeopleプロパティをバインドして、DataTemplateでPersonクラスを表示する場合は以下のように書きます。</ListBox.ItemTemplate></ListBox>実行すると以下のような見た目になります。ItemTemplateにUserControlを指定する場合ItemTemplateの中身をUserControlにすることはよくあると思います。その場合にコンパイル時バインディングを使うには、UserControlにViewModelというDataContextプロパティをキャストして公開するプロパティを定義します。以下のようになります。PersonViewというUserControlを作ってPerson型のViewModel依存関係プロパティを作ります。}}Bindingsプロパティについてコンパイル時バインディングを使うとBindingsプロパティというものがViewに定義されます。これのUpdateメソッドを呼び出すとすべてのコンパイル時バインディングを強制的に再評価するものになります。DataContextが変わる度に、コンパイル時データバインディングを再評価している点がポイントです。UserControlのXAMLでPersonクラスの見た目を定義します。</StackPanel></UserControl>これをItemTemplateに設定します。</ListBox.ItemTemplate></ListBox>実行すると以下のようになります。Converterコンパイル時バインディングも、Converterを使うことができます。通常のConverterのとしての使い方の他にコンパイル時に型解決を行う関係上いけてない仕様になってしまっているところでもちょっと使うことがあります。先ほどのコレクションのBindingで、SelectedItemとViewModelに定義した以下のようなプロパティをバインドするとコンパイルエラーになります。}}コンパイルエラーの内容は以下のようになります。バインドできませんつまりSelectedItemがobject型なのに対してSelectedItemがPerson型なのでそのままだと代入できないといわれてるのです。SelectedItemは今回の場合はPerson型であることは確実なので代入してほしいところですよね。愚痴っても仕方ないので解決策です。何もしないConverterを作っておくというのが解決策になります。}}そして、これをConverterに指定します。</ListBox.ItemTemplate></ListBox>ConverterはPageのResourcesかApp.xamlのResourcesあたりからとれるように定義する必要があります。これで実行するとちゃんとコンパイルが通るようになります。その他ここでは紹介していませんが、x:Bindでは、以下のようなプロパティが指定できます。失敗したときの表示する値まとめx:Bindでは、できることが通常のBindingに比べて少ないですが、使える場所では使うようにするとか、x:Bindで解決できるようにアプリを見直すことでパフォーマンスの向上が見込めます。最後に、ここで書いたプログラムは以下のGitHubのリポジトリからダウンロードできます。b...なんて訳すんでしょうね。C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。Blogの内容は個人の見解であり、所属する企業を代表するものではありません。)はてなブログをはじめよう!okazukiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。