私は、MV-MC (Model-View-ModelController) と呼んでいる MV-VM のフレーバーを使用して、非常に大きな LOB アプリを開発してきました。これは、MVC と MV-VM の一種の組み合わせです。MV-VM でビューがどのようにインスタンス化されるかに関するこの回答を、「 wpf 開発で最も一般的な間違いは何ですか」という質問に投稿しました。
サムは私の答えに関して次のコメントをしました:
これにより、フォローアップの質問が作成されます。ビューをどのように作成しますか? RelayCommands を使用してアクションをビューから ViewModel にバインドするため、ビューはアクションが発生したことさえ認識せず、新しいビューを開く必要があることも認識しません。解決策: ビューがサブスクライブするためのイベントを VM に作成しますか?
私が最初に MV-VM の開発を始めたとき、私はすべてが ViewModel に存在するべきであるという考えを持っており、Josh SmithやKarl Shifflettのような人々から多くの例を研究しました。ただし、コマンドが ViewModel に存在する必要がある場合の良い例をまだ見つけていません。
たとえば、顧客を表示する ListView と、現在選択されている顧客を編集するためにクリックするボタンがあるとします。ListView (View) は CustomerVM (ViewModel) にバインドされます。ボタンをクリックすると、EditCustomerCommand が起動され、CustomerVM のすべてのプロパティを編集できるポップアップ ウィンドウが開きます。この EditCustomerCommand はどこにありますか? ウィンドウを開く必要がある場合 (UI 機能)、ビューのコード ビハインドで定義すべきではありませんか?
ビューとビューモデルでコマンドを定義する必要がある場合の例はありますか?
マシュー・ライトは次のように述べています。
リストからの新規作成と削除が良い例です。そのような場合、空のレコードが追加されるか、ViewModel によって現在のレコードが削除されます。ビューによって実行されるアクションは、発生したイベントに応答する必要があります。
新しいボタンをクリックするとどうなりますか? CustomerVM の新しいインスタンスは、親 ViewModel によって作成され、そのコレクションに追加されますか? では、どのようにして私の編集画面が開かれるのでしょうか? ビューは Customer ViewModel の新しいインスタンスを作成し、それを ParentVM.Add(newlyCreatedVM) メソッドに渡す必要がありますか?
VM 上にある DeleteCommand を使用して顧客レコードを削除するとします。VM はビジネス レイヤーを呼び出し、レコードの削除を試みます。できないので、VM にメッセージを返します。このメッセージをダイアログボックスに表示したい。ビューはどのようにしてコマンド アクションからメッセージを取得しますか?