2

別のViewModelを作成できるViewModelがあります。

この ViewModel を既存のビューのデータ コンテキストとして設定し、そのビューに移動します。

MyViewModel 内

private void CreateNewOrder()
{
    var order = new OrderViewModel(new Order(){/* setup some things */});
    // another ViewModel subscribes to MyCustomEvent
    this.eventAggregator.GetEvent<MyCustomEvent>().publish(order); 
    this.regionManager.RequestNavigate("DetailRegion", new Uri("OrderView", UriKind.Relative));
}

問題は ...

  • 私のViewModelは、リージョンの名前とビューの名前への参照が必要です。
  • 「DetailRegion」には「OrderView」オブジェクトが含まれている必要があります。
  • DetailView.DataContext が OrderViewModel に設定されている (集約イベント サブスクリプションを使用)

これは密結合ですか?

Prism Quickstart プロジェクトを調べてみたところ、「コントローラー」または複雑すぎるものを見つけました。

View-ViewModel の分離を簡素化したいだけです。

4

1 に答える 1

9

ViewModelに追加したコードは、コントローラーに属しています。

  • ViewModelは、特定の形状のデータを保持するダムコンテナです。彼らは、データがどこから来たのか、どこに表示されているのかを知りません。
  • ビューは、ビューモデルへのバインディングを介して特定の形状のデータを表示します。彼らはデータがどこから来たのかを知らず、それをどのように表示するかだけを知っています。
  • モデルは実際のデータを保持します。彼らはどこで消費されているのかわかりません。

では、この写真には何が欠けているのでしょうか。-コントローラーは、イベントを公開およびリッスンし、モデルからViewModelのデータをフェッチします。また、ナビゲーションを制御します。

それは本当にMVCVMとして設計されるべきでした。コントローラクラスがないため、MVVMの誤用に終わりはありません。PrismQuickstartをもう一度試してください。

コントローラーがMVVM画像にどのように適合するかを明確にするために、シナリオの例を次に示します。

  • コントローラは、モジュールまたはアプリ*によって登録および初期化されます。
  • コントローラは「詳細を表示」メッセージをサブスクライブします。
  • コントローラは「詳細を表示」メッセージを受信します。
  • コントローラは「詳細」VMを構築し、データを入力して、ICommandプロパティをコントローラのコードに割り当てます(たとえば、ほとんどすべてのアプリロジックはコントローラにあります)。
  • コントローラは適切なビューの表示をトリガーし、VMに供給します。
  • ビューデータはVMにバインドされます。ボタンはVMのICommandにバインドされています。
  • ユーザーがデータを編集し、[送信]をクリックします。送信コードはコントローラーにあり、VM内の新しいデータをどう処理するかを決定します。

*注:VMとビューはメッセージを待つ必要がないため、アプリの存続期間中はコントローラーのみが実際に存在する必要があります(つまり、フットプリントが非常に小さい)。これはモバイルアプリに最適であり、一般的にどのアプリにも適しています。

于 2012-04-23T15:23:59.343 に答える