2016-04-07 9 views
3

私はMVVM WPFアプリケーションを構築しています。そこには、ViewModel(VM)をデータコンテキストとして使用する親ビュー(V)に複数の子ビューがロードされたウィザードがあります。 MVVMのパターン原則の1つは、VMにバインドされているVについての知識がVMに与えられてはならないということです。この場合、VMは実際にVを認識しませんが、VM(1)は異なる子ビュー(異なるステップ)からなるリストプロパティを管理します。(2)CurrentViewという名前の別のプロパティがあります。要素をリストに追加します。 CurrentViewはV.MVVM ViewModel and childビュー

ContentControl

に結合している私の質問があるさ:

  1. ですVM内の(子)ビューを管理しても大丈夫でしょうか?換言すれば、VMは親Vについては知らないが、どの子ビューがロードされるべきかを知っている。
  2. 異なる子ビューに対して異なる子VMを使用するのではなく、ただ1つの親VMを親Vにバインドします。子Vがロードされると、それは含まれている親Vと同じデータコンテキストを共有できます。正しいやり方は?

答えて

8

親ビューモデルは、子ビューモデルの知識ではなく、子供ビューを持つ必要があります。同様に、ビューではなく、ビューモデルではなく、子ビューを切り替える必要があります。あなたが現在を表示するビューの一部で、その後

<Window.Resources> 
    <DataTemplate DataType="{x:Type vm:WizardScreen1ViewModel}"> 
     <v:WizardScreen1 /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:WizardScreen2ViewModel}"> 
     <v:WizardScreen2 /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:WizardScreen3ViewModel}"> 
     <v:WizardScreen3 /> 
    </DataTemplate> 
</Window.Resources> 

:ここ

は、このようないくつかのデータテンプレートを作成し、...あなたはこれについて行くかもしれないどのようにあなたのビューで

ですウィザード画面で、次のように、ContentControlを置く:あなたの親ビューモデルで

<ContentControl Content="{Binding CurrentWizardScreenViewModel}" /> 

、あなたがを発射CurrentWizardScreenViewModelプロパティが必要になります0イベントが発生した場合に発生します。

親ビューモデルのコマンドにバインドするには、ウィザードの次/前ボタンが必要です。これにより、CurrentWizardScreenViewModelは次/前の画面のビューモデルに設定されます。

これを行うと、データバインディングの魔法のおかげでウィザード画面の表示が自動的に切り替わります。

+0

子VMに自分自身のデータを管理させる必要がありますか(つまり、手順3では手順1のものが必要かもしれません)、親VMのすべてを処理するだけですか? – tab87vn

+1

@ tab87vn、そこにはいくつかの方法があります:(1)親ビューモデルに、各子ビューモデルの変更通知をリッスンして共有状態を管理/編成してから、他の子ビューモデルに通知する(2)親ビューモデルを残して、子ビューモデルにメッセンジャー(ほとんどのMVVMライブラリがサポートする)を使用して直接対話させることができます。 – devuxer

関連する問題