4

サードパーティのヘルパーとしてMVVMLightToolkitを使用するWPFMVVMアプリケーションを開発しています。私のシナリオは次のとおりです。

メインウィンドウがあり、メインウィンドウを閉じているときに、新しいダイアログウィンドウ(変更の保存ダイアログウィンドウ)を表示して、ユーザーがアプリケーションで行った変更を状態ファイルに保存する必要があるかどうかを確認する必要があります。ではありません。MVVMでこのシナリオをどのように処理できますか?通常、新しいウィンドウを表示するために、MVVMLight Messengerクラスを使用しています。その場合、メインウィンドウから[変更の保存]ダイアログウィンドウを開きます。コードビハインド:[変更の保存]ダイアログウィンドウから選択したユーザーオプション(SAVE、SAVE / EXIT、CANCEL)に基づいてメインビューモデルにコールバックする必要があり、それに基づいてメインウィンドウを閉じる必要があるかどうかを確認する必要がありますか否か。このシナリオを処理するための最良のMVVMアプローチは何でしょうか?

4

2 に答える 2

1

ViewModelとの間でメッセージを渡すだけです。

表示

private void Window_Closing(object sender, CancelEventArgs e)
{
    Messenger.Default.Send(new WindowRequestsClosingMessage(
        this, 
        null,
        result => 
        { 
            if (!result)
                e.Cancel = true;
        });
}

ViewModel

Messenger.Default.Register<WindowRequestsClosingMessage>(
    this,
    msg => 
    {

        // Your logic before close

        if (CanClose)
            msg.Execute(true);
        else
            msg.Execute(false);
    });

メッセージ

public class WindowRequestsClosingMessage: NotificationMessageAction<bool>
{
    public WindowRequestsClosingMessage(string notification, Action<bool> callback)
        : base(notification, callback)
    {
    }

    public WindowRequestsClosingMessage(object sender, string notification, Action<bool> callback)
        : base(sender, notification, callback)
    {
    }

    public WindowRequestsClosingMessage(object sender, object target, string notification, Action<bool> callback)
        : base(sender, target, notification, callback)
    {
    }
}

MVVMLightのNotificationMessageAction<TResult>を使用すると、メッセージを渡してTResultタイプの結果を取得できます。TResultをリクエスターに戻すにはExecute()、例のように呼び出します。

于 2013-02-21T09:45:41.403 に答える
0

クロージングイベントで次のようなことをしないのはなぜですか。

    private void Window_Closing(object sender, CancelEventArgs e)
    {
        SaveDialog sd = new SaveDialog();
        if (sd.ShowDialog() == false)
        {
            e.Cancel = true;
        }
    }
于 2013-02-21T08:22:50.113 に答える