0

アプリケーションでは、MVVMレガシー コードで実行される長時間実行される計算があります。

そのレガシーコードは、MessageBox続行するかどうかをユーザーに尋ねることを示しています。

今、私はこのコードをMVVMできるだけ簡単に固執させたいと思っており、コールバックを渡して を表示し、MessageBox内部で結果を評価することを考えました。

これを最も簡単に行うにはどうすればよいでしょうか。

コールバックの Action をよく見てきましたが、レガシー コード内で bool を操作する方法がわかりません。

表示する文字列をレガシー コードから渡し、MessageBox決定 (bool) をレガシー コードに返したいと考えています。

注意: 今すぐ大きなリファクタリングを行う必要はありませんがMessageBox、レガシー コードの内部を今すぐ取り除きたいと考えています。

おそらく、次のような関数を使用できます

    private bool ShowMessageBox(string text)
    {
        var result = MessageBox.Show(text, "", MessageBoxButton.YesNo);

        if (result.Equals(MessageBoxResult.Yes))
        {
            return true;
        }

        return false;
    }

-編集-

なんか使ってみようかな

Action<string, Action<bool>> 

メソッド署名の?従来のコードで bool にアクセスするにはどうすればよいですか?

4

1 に答える 1

1

多分あなたは使うことができますdelegateか?

あなたが示した方法では、次のdelegateように作成できます。

public delegate bool ShowMessageBoxDelegate(string text);

delegate次に、 をタイプとして使用するプロパティがあるとします。

public ShowMessageBoxDelegate ShowMessageBoxDelegateProperty { get; set; }

ShowMessageBoxメソッドがこれの署名と一致する場合delegate...

public bool ShowMessageBox(string text)
{
    var result = MessageBox.Show(text, "", MessageBoxButton.YesNo);
    if (result.Equals(MessageBoxResult.Yes))
    {
        return true;
    }
    return false;
}

ShowMessageBoxDelegateProperty...次に、プロパティの値として設定できます。

ShowMessageBoxDelegateProperty = ShowMessageBox;

括弧がないことに注意してください。はマルチキャストにするdelegateこともできます。これは単に、複数のメソッドをアタッチできることを意味します。

ShowMessageBoxDelegateProperty += ShowMessageBox;

これらをメソッドのパラメーターとして使用することもできます。

public void ProxyShowMessageBox(ShowMessageBoxDelegate showMessageBoxDelegate)
{
    if (showMessageBoxDelegate != null)
    {
        bool result = showMessageBoxDelegate("MessageBox message");
    }
}

次に、次のように呼び出します。

ProxyShowMessageBox(ShowMessageBox);

詳細については、MSDNのデリゲート チュートリアルページを参照してください。

于 2013-08-22T22:17:24.347 に答える