RelayCommandのCanExecuteが呼ばれない(解決)

ダイアログの表示ができるようになったので、とコード書きを再開して一応は動くようになったかと思いきや、表題のようにボタンの状態が常に無効になってしまって計算が実行できませんでした・・(T_T)

なんでかなーと色々と試行錯誤して、ようやくコンボボックスの変更が通知されていないことをさっき発見(遅)。これまでのサンプルでは変更に応じて勝手にCanExecuteメソッドが呼ばれていたのに、MVVM Lightを使ったサンプルだけが無反応となっていました。

結論として、現在の最新Verである5.0系ではPCLに対応するために、WPF固有のCommandManagerを利用しないようになったのが原因ぽいです。

The explanation of why this is needed will go into a blog post coming up soon. In short: The WPF4.5 and 4.5.1 versions of MVVM Light are now a Portable Class Library. It makes sense for many reasons. However the CommandManager does not exist in the PCL space, which is why your code, which relies on the CommandManager didn't work anymore.

Relay Command CanExecute() not working in WPF - CodePlex

では、どうすれば良いかというと、新たに定義された名前空間に同名のクラスが用意されたので GalaSoft.MvvmLight.Command → GalaSoft.MvvmLight.CommandWpf に変更してね、ということらしい。名前空間に思いっきりWPFて入ってる^^;

たぶん既存のユーザに配慮した感じなんでしょうね。。試してみると、確かに他のコードに手を入れなくてもCanExecuteメソッドが呼び出されるようになりました。

ただ、今後利用する場合は RaiseCanExecuteChanged メソッドを自分で呼ぶようにした方が良いような気もします。 もしくは、調べている途中で見つけた↓のような独自のコマンドを作成してしまうとか。

How to automatically call the CanExecute method when properties change with MVVM Light in Windows and Phone apps

基礎を学べれば、と先人のコードを書き写してくだけのつもりだったのに、次々と地雷を踏みぬいているこの感じはなんなんだろう・・w