7

私は WPF で MVP/MV-VM を実装していますが、これまでのところうまくいっています。ただし、このモデルがモーダル ダイアログ ボックスの実装をどのようにサポートしているかはわかりません。私は Crack.NET ( http://www.codeplex.com/cracknetproject ) から自分の作品を派生させて、この作業がどのように機能するかを学びました。

メニューがある ShellView ビュー (単なる XAML) があります。このメニューは、「EditPreferences」という ShellModelView のコマンドにバインドされます。

ShellModelView は EditPreferences の ICommand を実装します。ここでは、ユーザーがアプリケーションの設定を編集できるようにするダイアログ ボックスを表示します。

ここにいくつかの問題があります: 1. ShellModelView には、ダイアログを適切に親にするための ShellView への参照がありません。ShellModelView は ShellView の DataContext ですが、セットアップされた後方参照が表示されません。2. いずれにせよ、ShellModelView は明示的な UI をロードするべきではありません。では、ここでの適切な対話モデルは何でしょうか? 3. ロジックとビューも適切に分離されるように、PreferencesDialog を構築するにはどうすればよいですか? PreferencesDialog 自体は Window である必要があるため、その上で ShowDialog を呼び出すことができますが、これはインスタンス化するために Window (View など) への参照が必要であることを意味します。理想的には、PreferenceDialog 内でビューをインスタンス化せずに (おそらくモック ビューを使用して) コード/検証を単体テストできるはずです。

4

4 に答える 4

6

おそらくこれは適切な見方ではないかもしれませんが、これは私が WPF の MV-VM で採用しているアプローチです。ウィンドウやダイアログ ボックスを開く、または「EditPreferences」ビューは、UI 固有の機能です。すべてのビューを置き換えて UI 全体を書き直す場合、「EditPreferences」ビューを別のビューと組み合わせてしまう可能性があるため、別の画面で開きたくありません。これが ViewModel に関連付けられている場合、回避するのは困難です。この特定の状況では、「EditPreferences」ビューの新しいインスタンスを作成する「ShellView」にボタンまたはメニュー項目があり、「EditPreferences」ViewModel を渡します。これは、「ShellViewModel」のプロパティから取得される可能性があります。 "、またはおそらく私の "EditPreferences" ビューは ViewModel 自体をインスタンス化します。

基本的に同じことを言っているSOに関する同様の質問があります:MV-VM Design Question。ViewModel から View を呼び出す

于 2008-11-25T14:40:59.493 に答える
1

EditPreference コマンドのプロパティの 1 つであるインターフェイスを PreferencesDialog に実装させます。コマンドは、インターフェイスを介してダイアログと対話します。単体テストでは、代わりにモック オブジェクトがインターフェイスを実装します。

ダイアログ クラスは、最上位層に配置できます。

于 2009-01-09T20:20:37.283 に答える
1

ケースにはコントローラーが必要です。コントローラは、設定ダイアログ ウィンドウの表示を担当する必要があります。

私が想像できるように、コントローラーは ShellModelView を作成し、ビューの DataContext をそれにバインドする必要があります。コントローラーは、EditPreferences のコマンド実行の処理も担当する必要があります。実行ロジックでは、コントローラーは新しい PreferencesDialog とそれに対応するビュー モデルを作成します。

まだ行っていない場合は、 Prismで同様のパターンを見つけることができます。そこに提供されている DelegateCommand を再利用することもできます:)

于 2008-11-24T20:17:29.720 に答える
0

私の2セントは:

  1. コマンド パラメーターとしてある種の viewfactory コントラクトを渡すか、viewfactory コントラクトをビュー モデルに挿入します。ビュー モデルは、viewfactory を使用して、必要なモーダル/非モーダル ビューを作成します。viewfactory は、Show/ShowModal メソッドのパラメーターとして、表示するビューモデルを受け取ることもできます。さらに、viewfactory は datatemplate を使用して、パラメーターとして渡されたビューモーダルを表示できます。

  2. 問題のビューモデルに ShowViewModel プロパティを追加します。その後、DataTrigger はこのプロパティを監視し、特定のタイプの場合はビューなどを表示できます。

于 2009-11-19T21:09:59.787 に答える