しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Silverlight for Windows Phone の残念な点

既に Twitter では何回か呟いてるんですが、Silverlight ってバージョン 3 までは FrameworkElement を継承したオブジェクトしかバインディングターゲットになれないんですね。恥ずかしながら知りませんでした。

バインディングソースには DependencyObject やら INotifyPropertyChanged を実装した POCO でも問題はないです。*1

なので、FrameworkElement を継承しない Transform などにはバインディングすることは出来ません。つまり、次のコードのように RotateTransform.Angle に Slider.Value のバインドしようとするとパーサエラーが出て失敗します。

<Image.RenderTransform>
    <RotateTransform Angle="{Binding Path=Value, ElementName=slider1}" />
</Image.RenderTransform>

何が問題なのか

FrameworkElement を継承したオブジェクトしかバインディングターゲットになれない、つまりは先程の例のように視覚要素が無いオブジェクトにはバインディング出来ないということです。

一般的には TextBox.Text や Slider.Value などの UI 部品にバインドすることが多いと思うのであまり問題は無さそうなのですが、これが MVVM を使うとなると非常に面倒なことになってきます。

MVVM とはなんぞや

MVVM については非常にめんどくさい俺もよくわかってない、@ugaya40 さんが日本で一番詳しいと思うので、こちらを参照してください。http://ugaya40.net/wpf/mvvm-reference.html

誤解を恐れずに書くと、コードビハインドとか書きたくないんですよ!今の世界はコードビハインドを書かないようになってきてるんですよ!ASP.NET だって MVC Framework 登場でコードビハインドなしで aspx とか書いちゃうんですよ!コードビハインドは楽だけど、テストしにくいんですよ!ゆるゆるの繋がりのが後々絶対に楽なんですよ!(妄想終わり)

軽く取り乱しましたが、数年後には「MVVM 使ってないのが許されるのは WinForms までだよねー、キャハハハハハ」という時代がやってきますよ。たぶん、きっと、WPF が流行れば…。

バインディングが必要な理由

何故、MVVM でバインディングが重要なのか。それは勿論 DataContext に ViewModel を突っ込んで様々なコントロールとバインディングしていくからです。イベントハンドラなんて使いません、基本的にコマンドとビヘイビアを使って解決します。そのコマンドオブジェクトを指定する時にもバインディングを使います。

<!-- これは WPF の場合 -->
<Button Command="{Binding Path=CancelCommand}">Cancel</Button>

この場合、Button は ICommandSource を実装していて、FrameworkElement も継承してるから問題ないんですが、Silverlight の場合はコマンドを使うためにビヘイビアを使って間接的に呼び出す必要があります。当然ながらビヘイビアのプロパティにバインディングするわけですが、ビヘイビアは普通 FrameworkElement なんて重量級オブジェクトは継承してません。

なので、このままだとコマンドのバインディングが出来ませんよ!まあ、どうしましょう!!

  • 解決策1
    • コードビハインドを泣きながら使う
  • 解決策2
    • 「MVVM 使えないとかマジありえない…、WPF でいいわ。」と言って放置
  • 解決策3
    • Button などを継承して Command プロパティを実装する
  • 解決策4
    • Microsoft が Silverlight for Windows Phone を Silverlight 4 相当に更新するのを待つ

MVVM Lover <3 としてはコードビハインドとか汚らわしくて触りたくありません(キリッ

既に端末も APP HUB 登録も EIN 申請もしてしまっているので放置プレイも却下。コントロールの継承とかマジめんどくさいのでこれも却下。

残るは Microsoft が Silverlight 4 相当に更新するのを待つということになりました。IYH!!!! というのは半分ネタですが、WP7 の Silverlight がバージョン 3 相当なのは 4 の開発が間に合わなかっただけなので、個人的楽観的予想では来年 1 月の CES か 2 月の MWC で XBOX アバターの再現度が半端なく高いことで有名な Joe が何か発表してくれると信じてます。

何が言いたかったのか

自分でもよくわかりません!一つ言えることは、今の WP7 では MVVM が厳しすぎるので開発しにくいですね。ということです。

来年は Windows Phone 7 飛躍の年であることはまあ間違いないと思うので、私たちデベロッパーも日本語に非対応のアプリを開発しまくって海外で勝負しましょう!

*1:匿名型にはバインド出来ません。WPF では出来ます。