3


0

MVVMでのWPFの「X」閉じるボタンの処理

WPFで基本的なデータベースアプリケーションを作成し、MVVMパターンの使用を開始しました。

ユーザーに `ListBox`から項目を選択して[OK]をクリックするように求めるダイアログがあります。その後、ユーザーがビューモデルのプロパティからクリックしたアイテムを取得し、別のダイアログに渡します。 しかし、ユーザーが「キャンセル」をクリックすると、その値を「null」に設定し、アクションはキャンセルされます。次のダイアログを開いてメイン画面に戻りません。 例:

public class SelectEquipmentViewModel : WorkspaceViewModel
{
    private bool _selected;

    public Equipment SelectedEquipment
    {
        // Item selected by the user
    }

    // Action for "SelectCommand," which is attached to
    // the "Select" button in the view
    public void ExecuteSelect()
    {
        _selected = true;

        // Fires a RequestClose event in WorkspaceViewModel,
        // which is attached to the view's Close method
        RequestClose();
    }

    public override void RequestClose()
    {
        if (!_selected)
        {
            // The user clicked "Cancel"
            SelectedEquipment = null;
        }

        base.RequestClose();
    }
}

これはうまく機能していますが、ユーザーがウィンドウのコントロールボックスの赤い「X」閉じるボタンをクリックすると問題が発生します。 RequestClose`メソッドは決して呼び出されず、選択された項目は null`に設定されません。これは悪いことです。

ビューの「Closing」イベントにビューモデルをアタッチすることを検討しましたが、これらすべてのイベントのハンドラーの作成を開始すると、これが面倒になる可能性があると感じています。

この状況を処理する「優先」方法は何ですか?

ありがとう。

3 Answer


1


EventToCommandビヘイビアーを使用して、WindowオブジェクトのClosingイベントを新しいExecuteCancelコマンドに結び付けるのはかなりきれいだと思います。

public void ExecuteCancel()
{
    _selected = false;

    // Fires a RequestClose event in WorkspaceViewModel,
    // which is attached to the view's Close method
    RequestClose();
}

これはどこが面倒になると思いますか? [キャンセル]ボタンを追加すると、同じExecuteCancelビットを使用できます…​


0


ビヘイビアは、ユーザーがMVVMを使用してウィンドウの[X]ボタンを押したときにコマンドを実行するために使用するものです。 Reed Copseyのブログはこちらをご覧ください:http://reedcopsey.com/2009/10/09/using-behaviors-to-allow-the-viewmodel-to-manage-view-lifetime-in-m-v-vm/

サンプルアプリケーションをダウンロードできますhttp://gallery.expression.microsoft.com/en-us/WindowCloseBehavior [こちら…​]

ViewModelがビューの寿命を管理できるように、常にこのメソッドを使用します。


0


追加の依存関係のないアプローチについては、記事http://www.codeproject.com/Articles/73251/Handling-a-Window-s-Closed-and-Closing-events-in-t [ウィンドウのClosedイベントとClosingイベントを処理するView-Model]および提供された例のコード。 これは、xamlの背後にコードを追加しません。

(Reed Copseyのhttp://reedcopsey.com/2010/04/15/attached-property-port-of-my-window-close-behavior/ [リンク]に感謝)