かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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のコマンドを紐づけることができます。テキストと一致してないとダメという点がいまいちいけてないですね・・・。