ViewModelでViewのインスタンスを取得するにはどうすれば良いかということについて、以下のエントリを以前書いた。
【WPF】 MVVMパターン。ViewとViewModelをXAMLだけで結び付けると疎結合が強すぎて使いづらい場合がある。
http://blogs.wankuma.com/trapemiya/archive/2009/06/15/175422.aspx
上記のように私の一つの結論が、Viewの生成時にViewModelへViewのインスタンスを渡してしまえというものであった。ViewからViewModelのインスタンスは、ViewのDataContextプロパティで簡単に取得できる。
つまり、ViewのDataContext(ViewModelのインスタンス)の逆パターンである、ViewModelでViewのインスタンスを持つことを考えたのである。
これはこれでうまくいった。インターフェースを使えばViewでViewModelの固有の型を使う必要はなく、コードは汎用的になる。この辺りのサンプルは以下に書いた。
MVVMでView内のコントロールをViewModelで参照したい
http://social.msdn.microsoft.com/Forums/ja-JP/wpfja/thread/ff497b52-f8f3-4c48-b4b4-f31edf56db22
しかし、である。いくら汎用的なコードとはいえ、Viewのコードビハインドにコードを書かなければならない。この解決方法、つまりViewのコードビハインドに全くコードを書かなくても良い方法を、上記のページでyayadonさんが述べている。Command実行時に、CommandParameterとしてWindowのインスタンスをViewModelへ渡してあげれば良いのだ。目から鱗であった。
ViewのXamlにおいて、
View(Windowオブジェクト)のNameにMyWindowを設定した上で、
Command="{Binding Path=UpdCommand}" CommandParameter="{Binding ElementName=MyWindow}"
とするだけで良い。(Windowのインスタンスをどうやって指定するのかは少し悩んだ。)
と、ここでハタと思い付いた。あるクラスを用意し、その依存関係プロパティにViewのインスタンスを突っ込み、そのクラスでViewModelにそのインスタンスを渡してやればいいんじゃないかと。そのクラスはちょうどViewからViewModelへViewのインスタンスを橋渡しする働きをするわけだ。
明日にでも試してみよう。今日はこれから飲み会なんで。