私は通常、ある種のWindowViewLoaderServiceを作成することによってこれを処理します。プログラムが初期化されたら、ウィンドウとViewModelを次のようなコードで登録します。
WindowViewLoaderService.Register(TypeOf(MainWindowView), TypeOf(MainWindowViewModel));
WindowViewLoaderService.Register(TypeOf(MyWindowView), TypeOf(MyWindowViewModel));
次に、たとえばViewModelからこのサービスを呼び出すことができ、参照する必要があるのは他のViewModelだけです。たとえば、MainWindowViewModelを使用している場合、次のようなコードが含まれている可能性があります。
var myChildWindowVM = new MyWindowViewModel();
WindowViewLoaderService.ShowWindow(myChildWindowVM);
次に、WindowViewLoaderServiceは、渡された指定されたViewModelに関連付けられているビューを検索します。そのビューを作成し、そのDataContextを渡したViewModelに設定してから、ビューを表示します。
このようにして、ViewModelはビューについて知ることはありません。
あなたはこれらのサービスのあなた自身のものをかなり簡単に転がすことができます。必要なのは、キーがViewModelTypeで、値がViewTypeであるディクショナリを保持することだけです。Registerメソッドはディクショナリに追加され、ShowWindowメソッドは渡されたViewModelに基づいて正しいビューを検索し、ビューを作成し、DataContextを設定してから、Showを呼び出します。
ほとんどのMVVMフレームワークは、箱から出してすぐにこのようなものを提供します。たとえば、Caliburnには、このフレームワークでViewLocatorと呼ばれる命名規則を使用する洗練されたものがあります。要約するリンクは次のとおりです。http://devlicio.us/blogs/rob_eisenberg/archive/2010/07/04/mvvm-study-segue-introducing-caliburn-micro.aspx
一方、CinchはそれをWPFUIVisualizerServiceと呼んでおり、ここで実際の動作を確認できます:http:
//www.codeproject.com/KB/WPF/CinchIII.aspx
これらはあなたが転がるのを助けるはずです。