18

WPFアプリケーションのMV-VMを調べ始めたところです。この特定の問題を除いて、これまでのところすべてが理にかなっています...

Searchと呼ぶViewModelがあります。このViewModelはデータグリッドにバインドし、アイテムの結果を一覧表示します。これで、別のビュー、アイテムの詳細を表示する必要があるコマンドがあります。

検索ビューに別のビューを表示するロジックを配置することは正しくないように思われ、まったくテストできません。

これが私のViewModel実装ですが、テストできません...

public class SearchViewModel
{
   public void SelectItem()
   {
     // I want to call the DetailsView from here
     // this seems wrong, and is untestable
     var detailsView = new DetailsView();
     detailsView.Show();
   }
}

ViewModelメソッドからのビューを表示するロジックはこのパターンでどこに行きますか?

4

5 に答える 5

19

キフが指摘したように:

ビューは、UI レイヤーの「下」でインスタンス化しないでください。VM はそのレルムの下に存在するため、これはそのロジックを配置する場所ではありません (既に認識しているように)。

ほとんどの場合、ビューを作成する必要があることを示す UI レベルのイベントが発生します。あなたの例では、データグリッドの行 (ダブル) クリック イベントである可能性があります。それは、新規作成して DetailsView ウィンドウを表示する場所です。

MV-VM は、MVC や MVP などの他のパタ​​ーンとは少し異なることに注意してください。ViewModel は UI を直接認識しません。別のビューを開くことは、ビュー固有の機能です。ビュー モデルは、そのデータを使用しているビューの種類や数を気にする必要はありません。コマンドでビューを開くことはおそらくないでしょう。

代替テキスト

于 2008-11-20T21:27:11.190 に答える
13

ビューは、UI レイヤーの「下」でインスタンス化しないでください。VM はそのレルムの下に存在するため、これはそのロジックを配置する場所ではありません (既に認識しているように)。

ほとんどの場合、ビューを作成する必要があることを示す UI レベルのイベントが発生します。あなたの例では、データグリッドの行 (ダブル) クリック イベントである可能性があります。それは、新規作成して DetailsView ウィンドウを表示する場所です。

于 2008-11-19T21:27:12.577 に答える
4

これに関する基本的な経験則は次のとおりです。

  • ビューでローカルアクションを処理している場合は、ビューモデルから開始できます。

  • クロスビュー(検索画面の表示など)の場合は、EventAggregatorパターン(イベントサービス)を使用するか、メソッドを呼び出すアプリケーションコントローラーを挿入すると、検索が表示されます。

于 2009-01-30T10:28:14.900 に答える
1

Catelには、 の使用を伴うアプローチが含まれていますIUIVisualizerService。このインターフェイスは、ViewModel からモーダルまたはモーダレス形式でダイアログを表示するために使用できる UI コントローラーを定義します。基本的に、親 vm 内で、新しいビューの背後にあるビューモデルを作成すると、サービスは関連付けられたビューモデルを (何らかの規則または登録に基づいて) 見つけて表示します。

于 2012-12-29T19:00:09.580 に答える
0

このパターンのバリアントを使用します。ここには VM を表すコントローラーがあるため、ビューのデータコンテキストは VM であり、DTO は VM/コントローラーのプロパティです。これをコントロールポイントとして使用し、ビューから特定のコマンドを処理するため、これをコントローラーと呼びます。これは(私が思うに)あなたのようなコマンドを実装する場所です。

于 2008-11-19T20:37:13.520 に答える