2

パターンを使用する WPF アプリケーションがあり、プリンシパル ビュー モデルからダイアログを表示する必要があります。

ビュー モデルを含むセカンダリ ビューがあり、ダイアログを作成するには 2 つのオプションがあると思います。

オプション1

プリンシパル ビュー モデルでは、次のことができます。

  1. ダイアログのビューを作成する
  2. ダイアログのビュー モデルを作成します
  3. ビュー モデルをビューに割り当てる
  4. 表示ダイアログ

オプション 2

プリンシパル ビュー モデル:

  1. ダイアログのビューモデルを作成する

ダイアログのビューモデルのコンストラクターで:

  1. ダイアログのビューを作成する
  2. ビュー モデルをビューに割り当てます。この場合は「これ」を割り当てます
  3. 表示ダイアログ

MVVM では、ビュー モデルはビューについて何も知る必要がないことはわかっていますが、実際には、ビュー モデルにビューにリンクするプロパティがなく、コンストラクターで作成され、ビューモデルはビューについて何も知らない最終状態。

ただし、4 行を必要とするオプション 1 (ビューの作成、ビュー モデルの作成、割り当てビュー モデルをビューに追加し、ダイアログを表示します)。

パターンに従いたい場合、2 番目のオプションは悪い考えではないと考えるのは間違っていますか?

4

3 に答える 3

1

どの道を選んだとしても、問題はひとつ。
率直に言って、ダイアログだけでなく、すべてのウィンドウに関係します。そして MVVM では、これは本当に苦痛になる可能性があります。少なくとも、WinForms と WPF の両方を使用するチームにとっては。

ほとんどの開発者は、ウィンドウの親子関係を忘れています。
ダイアログ ウィンドウに関しては、これにより UX がいくらか低下します。表示されたダイアログが原因で応答しないメイン ウィンドウの下にダイアログが移動する可能性があります。(簡単に再現できます)。

そのため、MVVM では何らかの方法で親を設定する必要があります。ここで重要なのは、View が Window である必要はないということです。

ここで、その方法を説明します。
ViewModel ファーストのアプローチを優先しました。ただし、VM には View を挿入しません。ビューのインスタンス化、親子関係、およびいくつかのイベントのリッスンを担当する IViewService を渡します。
ユーザーが右上隅の十字をクリックしたときに、VM がそのビューを閉じないようにする方法を考えてみてください。

于 2013-04-03T08:32:19.400 に答える
1

ほとんどの場合と同様に、ソリューションを実装するにはいくつかのアプローチがあります。

いくつかのダイアログ、ウィンドウ、またはページを持つ大規模なアプリケーションの場合、最良のアプローチはサービスIDialogHandlerです。これは、c_tor を介して VM に与えられます。この投稿で例を見つけることができます。
大きな利点は、ビューへの参照がないため、VM を簡単にテストできるデカップリングです。

たとえば、2 つまたは 3 つの異なるダイアログを使用する小規模なアプリケーションの場合、次のアプローチも適切です。

public class DialogView : Window
{
    // a method to create easily a dialog
    public static void ShowDialog(DialogViewModelBase dialogVm)
    {
        var dialog = new DialogView { DataContext = dialogVm };
        dialog.ShowDialog(); // pls note, that this will create a modal dialog
    }
}

そのDialogView.ShowDialog(...)ため、どこからでも呼び出すことができます。ただし、ここでは VM にビューへの参照があります。これはOPTION 1
に 似ていますが、ステップの順序は同じではありませんが、十分に近いです。

于 2013-04-03T07:40:51.300 に答える
1

私はwpfのダイアログに対してこれを行います

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);

... do anything with the dialog result...
于 2013-04-03T07:41:07.903 に答える