かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Windows Phone 7のApplicationBarのApplicationBarIconButtonにViewModelのCommandをバインドする方法

ぱっと見無さそうに見えた!
ということで、Prismの中を見てみたらApplicationBarButtonCommandというものがあるじゃないですか。これは使える!?と思ってみたら使い方がわからない。素直に言うとApplicationBarIconButtonにApplicationBarButtonCommandというビヘイビアーをぽとっと落とせば良さそうだと思ってたんですが、どうも違うらしい。

どうやって、ボタンとコマンドを結びつけているのか気になってソースを追いかけてみると、以下のようなコードになってました。

this.binding = new ClickCommandBinding(
    this.AssociatedObject.ApplicationBar.FindButton(this.ButtonText),
    (ICommand)this.commandBindinglistener.Value,
    () => this.parameterBindinglistener.Value);

FindButtonは何かというと、PrismのApplicationBarExtensionsに定義されている以下のような拡張メソッドでした。

public static ApplicationBarIconButton FindButton(this IApplicationBar appBar, string text)
{
    if (appBar == null) throw new ArgumentNullException("appBar");
    return (from object button in appBar.Buttons select button as ApplicationBarIconButton).FirstOrDefault(btn => btn != null && btn.Text == text);
}

つまり、ApplicationBarのテキストをもとに探してくるみたいです。ということで、ApplicationBarButtonCommandの使い方は以下の手順になります。

  1. ApplicationBarにApplicationBarIconButtonを置きます
  2. PhoneApplicationPageにApplicationBarButtonCommandを置きます
  3. ApplicationBarIconButtonのTextプロパティとApplicationBarButtonCommandのButtonTextプロパティの値を合わせます
  4. ApplicationBarButtonCommandのCommandBindingプロパティとCommandParameterプロパティを適当に設定します(普通はViewModelあたりのCommandとバインドしますね)

これで、ApplicationBarのボタンとViewModelのコマンドを紐づけることができます。テキストと一致してないとダメという点がいまいちいけてないですね・・・。