在长时间运行的过程中显示MessageBox

时间:2013-08-22 19:29:43

标签: c# wpf mvvm callback action

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;
    }

-edit -

我应该使用一些

Action<string, Action<bool>> 

方法签名? 如何在遗留代码中访问bool?

1 个答案:

答案 0 :(得分: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的Delegates Tutorial页面上找到更多信息。