Mvvm-hierarchies-and-navigation
MVVM –階層とナビゲーション
MVVMアプリケーションを構築する場合、通常、複雑な情報画面を親ビューと子ビューのセットに分解します。子ビューは、パネルまたはコンテナコントロールの親ビュー内に含まれ、使用の階層を形成します。
- 複雑なビューを分解した後、独自のXAMLファイルに分離するすべての子コンテンツが必ずしもMVVMビューである必要があるわけではありません。
- コンテンツのチャンクは、画面に何かを表示するための構造を提供するだけであり、そのコンテンツに対するユーザーによる入力や操作はサポートしていません。
- 別のViewModelを必要としない場合もありますが、親ViewModelによって公開されたプロパティに基づいてレンダリングするXAMLチャンクだけにすることもできます。
- 最後に、ViewsとViewModelsの階層がある場合、親ViewModelが通信のハブになり、各子ViewModelが他の子ViewModelsとその親から可能な限り分離されたままになることができます。
異なるビュー間の単純な階層を定義する例を見てみましょう。 新しいWPFアプリケーションプロジェクト MVVMHierarchiesDemo を作成します
- ステップ1 *-3つのフォルダー(Model、ViewModel、およびViews)をプロジェクトに追加します。
- ステップ2 *-次の図に示すように、ModelフォルダーにCustomerクラスとOrderクラス、ViewsフォルダーにCustomerListViewとOrderView、ViewModelフォルダーにCustomerListViewModelとOrderViewModelを追加します。
- ステップ3 *-CustomerListViewとOrderViewの両方にテキストブロックを追加します。 これがCustomerListView.xamlファイルです。
次に、OrderView.xamlファイルを示します。
ここで、これらのビューをホストするための何かが必要になります。これは単純なアプリケーションであるため、MainWindow内の適切な場所です。 ビューを配置してナビゲーション形式で切り替えることができるコンテナコントロールが必要です。 この目的のために、MainWindow.xamlファイルにContentControlを追加する必要があり、そのコンテンツプロパティを使用して、それをViewModel参照にバインドします。
次に、リソースディクショナリの各ビューのデータテンプレートを定義します。 以下はMainWindow.xamlファイルです。 各データテンプレートがデータ型(ViewModel型)を対応するビューにマップする方法に注意してください。
現在のビューモデルがCustomerListViewModelのインスタンスに設定されると、ViewModelが接続されたCustomerListViewがレンダリングされます。 これは注文ViewModelであり、OrderViewなどをレンダリングします。
現在、CurrentViewModelプロパティと、プロパティ内のViewModelの現在の参照を切り替えることができるいくつかのロジックとコマンドを持つViewModelが必要です。
MainWindowViewModelと呼ばれるこのMainWindowのViewModelを作成しましょう。 XAMLからViewModelのインスタンスを作成し、それを使用してウィンドウのDataContextプロパティを設定するだけです。 このために、ViewModelsのINotifyPropertyChangedの実装をカプセル化する基本クラスを作成する必要があります。
このクラスの背後にある主なアイデアは、適切な通知を簡単にトリガーできるように、INotifyPropertyChanged実装をカプセル化し、派生クラスにヘルパーメソッドを提供することです。 以下は、BindableBaseクラスの実装です。
CurrentViewModelプロパティを使用してビューの切り替えを実際に開始します。 このプロパティの設定を駆動する方法が必要です。 そして、エンドユーザーが顧客リストまたは注文ビューに移動するようにコマンドを実行できるようにします。 最初に、ICommandインターフェイスを実装するプロジェクトに新しいクラスを追加します。 以下は、ICommandインターフェイスの実装です。
次に、これらへのいくつかのトップレベルナビゲーションをViewModelsに設定する必要があり、その切り替えのロジックはMainWindowViewModel内に属する必要があります。 このために、文字列の宛先を取得してCurrentViewModelプロパティを返す、navigateと呼ばれるメソッドを使用します。
これらの異なるビューのナビゲーションのために、MainWindow.xamlファイルに2つのボタンを追加する必要があります。 以下は、完全なXAMLファイルの実装です。
以下は、MainWindowViewModelの完全な実装です。
BindableBaseクラスからすべてのViewModelを派生します。 上記のコードをコンパイルして実行すると、次の出力が表示されます。
ご覧のとおり、MainWindowには2つのボタンとCurrentViewModelのみが追加されています。 ボタンをクリックすると、その特定のビューに移動します。 [顧客]ボタンをクリックすると、CustomerListViewが表示されます。
理解を深めるために、上記の例を段階的に実行することをお勧めします。