0

私は今日のほとんどを、WPF/MVVM でダイアログを閉じるためのさまざまなアプローチを理解することに費やしました。ほとんどの回答は、はい/いいえの確認ダイアログなど、単純なダイアログに焦点を当てています。ただし、実際にいくつかのアクションを実行するダイアログのより複雑なケースについては誰も説明していないようです。これらのアクションは、トランザクション方式でコミットする必要があります。

ViewModel でバインドされたコマンドを呼び出す [OK] ボタンがあります。すべて良好。

コマンドが成功した場合はウィンドウを閉じたいのですが、コマンドが失敗した場合はウィンドウを閉じたくありません。

何時間にもわたる調査の結果、世界の誰も同様の問題を解決したことはないようだという結論に達しました:|

私が発明したが、まだ実装していない解決策は次のとおりです。

  1. ConditionalCloseWindowウィンドウをパラメーターとして取り、ウィンドウを閉じるコマンドがあります。

  2. コマンドにはConditionalCloseWindow添付プロパティがあります。

    public static readonly DependencyProperty 条件 =
        DependencyProperty.RegisterAttached("Condition", typeof(ICommand), ... 省略
    

  3. コマンドを実行するConditionalCloseWindowと、最初にコマンドが実行されConditionます。Conditionコマンドの実行が成功した場合にのみ、ConditionalCloseWindow実際にClose().

そのような解決策についてどう思いますか。それは完全に無効ですか?それとも、私の研究で発見できなかったのは、受け入れられているパターンなのでしょうか?

4

3 に答える 3

1

1 つの方法は、次のように、ViewModel で Closing イベント ハンドラーを設定します。

<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
    <command:EventToCommand Command="{Binding WindowClosing}" />
</i:EventTrigger>
</i:Interaction.Triggers>

ビューモデルで:

public ICommand WindowClosing
{
    get
    {
        return _windowClosing ?? _windowClosing = new RelayCommand<CancelEventArgs>(
            (args) =>{
                   if(somethingDoesNotMakeSense) 
                       args.Cancel = true;
                });
    }
}

これは少し厄介になる可能性がありますが。

私が考えた別のもの。

            <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <commandCall Command="ButtonClicked" />
                <commmandCall Command="CloseWindow" Parameter="{Binding VIewModelCanWeClose}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

CloseWindow は、Codebehind で実装されたコマンドである必要があります。これは、パラメーター「閉じる必要があるかどうか」を取得し、それに基づいて Close() を呼び出します。

于 2012-08-25T09:25:29.003 に答える
0

さまざまな「フォーム」コントロールがあり、検証、キャンセル/OK ロジック、閉じるなどの調整を行うことができます。

「モデル」で IEditableObject を使用して、変更のコミットをトランザクション方式で処理できます。

于 2012-08-24T23:18:42.917 に答える
0

あなたの問題を解決する方法はたくさんあります。私の最初の提案は、あなたのダイアログ ViewModel に action 型のプロパティがあることです。ダイアログは、そのプロパティをダイアログを閉じるアクションに設定します。コマンドでそのアクションを呼び出すと、ダイアログが閉じます。

于 2012-08-24T21:36:53.020 に答える