1

いくつかの異なる解決策を試した後、私はこれに戻ってきます。UnityContainerを介してViewModelLocatorクラスをファクトリとして使用するWindow.ShowDialogが必要です。

基本的に、ビュー(およびViewModel)があり、ビューをボタンで押すと、ロジックを処理して最終的に呼び出し元に結果を返すダイアログを作成する必要があります(コンストラクターでいくつかのパラメーターを取ります)。計算したすべてのロジックの結果)。

Windowsフォームの観点からこれを見るのは間違っているかもしれませんが、私は自分が何をしたいのかを正確に知っており、理想的にはWPFとMVVMを使用してそれを実行したいと思います。私はこのプロジェクトを機能させようとしていますが、最終的には、機能させるためにバニラWPFに戻る必要はありません。

4

2 に答える 2

2

ダイアログウィンドウを実装するためのルールを破りましたが、最小限に抑えようとしました。BaseViewModelにメソッドOpenDialogがあります。

public void OpenDialog(DialogViewModel model)
{
    this.MessengerInstance.Send<DialogViewModel, MainWindow>(model);
}

そして私のメインウィンドウで:

Messenger.Default.Register<DialogViewModel>(this, model =>
        {
            // Instantiate the dialog box
            var dlg = new DialogWindow();
            // Configure the dialog box
            dlg.Owner = this;
            dlg.Content = model;
            // Open the dialog box modally 
            dlg.ShowDialog();
        });

そうすれば、ビューモデルとMainViewの間の結合が緩くなるだけです。閉じる場合も同じことができます。私のBaseDialogViewModelには次のメソッドがあります。

public void CloseDialog()
    {
        this.MessengerInstance.Send<PopUpAction, DialogWindow>(PopUpAction.Close);
    }

(PopupActionは単なる列挙型です)そして私のDialogWindowはそのために登録します:

Messenger.Default.Register<PopUpAction>(this, action =>
        {
            switch (action)
            {
                case PopUpAction.Close:
                    this.Close();
                    break;
            }
        });

ビュークラスをビューモデルから除外するために、送信時にレシーバーを離れたままにすることもできますが、どちらの方法でも、許容できる解決策だと思います:)

于 2010-04-29T10:14:25.127 に答える
0

出来るよ。page/usercontrol/window のインスタンスを作成して を呼び出すだけinstance.ShowDialog()です。

これは、ウィンドウを閉じるためのメッセージやその他のトリックを含むビュー/ビューモデルを生成するための私の T4 テンプレートです。

于 2010-04-28T11:21:38.027 に答える