「Androidは電気羊の夢を見るか」を読みたい管理者のブログ

仕事などでの色々な発見を記事にしてます。不定期更新。

複数のViewでViewModelクラスのインスタンスを共有する方法

たとえばこんな感じだったとします。

Window

 UserControl1

 UserControl2

 

WindowのXAML内になんでも放り込むとごちゃごちゃするのでUserControlに分けたりするのですが、その場合ViewModelのインスタンスはどうなるんだと

 

ちなみにWindowとその子要素であるUserControlに同じクラスを指定するのは駄目で、内部的には別々のインスタンスを参照することになってしまうのですね。*1

 

で、どうやるかというと

 

UserControlのDataContextには何も指定しない

 

何も指定しなければ親要素であるWindowのDataContextと同じものを使うことになるので、ViewModelクラスのインスタンスを共有したことになるのですね。

 

なーんだ。簡単なことだ。。*2

 

何がいいかって、複数のViewクラスで同じデータを参照できるのでFormアプリケーションみたいに、Viewが違ったら別世界ってことがなくなります。わざわざModelのインスタンスを渡す必要がなくなるわけです。

Commandだって、バインディングしておけば複数のViewのボタンに同じ処理を定義することができる。

 

FormアプリケーションではViewを分けるのがあんなに面倒くさかったのに!

 

てなわけ。

 

なるほど、これは便利だ。

*1:同じクラスは複数のインスタンスを持てることはC#erにとっては常識だと思います

*2:この簡単なことに気付くのに1ヶ月半を要したわけですが