3
MVVMアプリケーションでナビゲーションを制御する必要があるのは誰ですか?
例#1:MVVMアプリケーションにビューが表示され(ディスカッションの目的でSilverlightを使用しましょう)、新しいページに移動するボタンをクリックします。 例#2:同じビューに別のボタンがあり、クリックすると、子ウィンドウ(ダイアログ)に詳細ビューが開きます。 ユーザーのクリックに応答するメソッドを持つボタンにバインドされたViewModelによって公開されるCommandオブジェクトがあることを知っています。しかし、それではどうでしょうか?どうすればアクションを完了できますか?いわゆるNavigationServiceを使用していても、何を伝えているのでしょうか? 具体的には、従来のビュー優先モデル(WebやSL組み込みナビゲーションフレームワークなどのURLベースのナビゲーションスキームなど)では、Commandオブジェクトは次に表示するビューを知る必要があります。パターンによって促進される懸念の分離に関しては、これは境界線を越えるようです。 一方、ボタンがCommandオブジェクトに接続されておらず、ハイパーリンクのように動作する場合、ナビゲーションルールはマークアップで定義できます。しかし、ビューでアプリケーションのフローを制御し、ナビゲーションは単なる別のタイプのビジネスロジックではありませんか?(場合によってはyes、その他の場合はnoと言うことができます。) 私にとって、MVVMパターンのユートピア実装(および他の人がこれを公言していると聞いたことがあります)は、アプリケーションがヘッドレスで実行できるように(つまり、ビューなし)ViewModelを配線することです。これにより、コードベースのテストに最も広い領域が提供され、ビューがアプリケーションの真のスキンになります。そして、私のViewModelは、メインウィンドウ、フローティングパネル、または子ウィンドウに表示されるかどうかを気にするべきではありませんか? このアプローチによると、各ViewModelに表示するビューを「バインド」するのは、実行時に他の何らかのメカニズムに依存します。しかし、ビューを複数のViewModelと共有したい場合、またはその逆の場合はどうでしょうか? したがって、View-ViewModel関係を管理する必要があるため、子ウィンドウ/ダイアログの表示など、ビュー間をナビゲートする必要がある場合に何を表示するかを知るために、MVVMパターンでこれをどのように実現しますか?