0

我在尝试转换InArgument<String>用于自定义活动设计器(重新托管)时遇到问题。我已经让它非常适用于数据类型,例如floatint。这个想法是让用户以最直观的方式输入设置。例如,使用 aTextBox用户可以输入文字数字(即 9)或 VB 表达式(即变量num)。这是一个示例转换器:

public class InArgumentIntConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        ModelItem modelItem = value as ModelItem;
        if (modelItem != null)
        {
            InArgument<int> inArgument = modelItem.GetCurrentValue() as InArgument<int>;

            if (inArgument != null)
            {
                Activity<int> expression = inArgument.Expression;
                VisualBasicValue<int> vbexpression = expression as VisualBasicValue<int>;
                Literal<int> literal = expression as Literal<int>;

                if (literal != null)
                {
                    return literal.Value.ToString();
                }
                else if (vbexpression != null)
                {
                    return vbexpression.ExpressionText;
                }
            }
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string itemContent = (string)value;
        InArgument<int> inArgument = null;
        try
        {
            int literal = int.Parse(itemContent);
            inArgument = new InArgument<int>(literal);
        }
        catch (FormatException)
        {
            VisualBasicValue<int> vbArgument = new VisualBasicValue<int>(itemContent);
            inArgument = new InArgument<int>(vbArgument);
        }
        catch (OverflowException)
        {
            MessageBox.Show("Your number is too big!");
        }

        return inArgument;
    }
}

这里的关键似乎是我可以通过使用适当的Parse()方法来检测文本框中的值是文字还是表达式,但是似乎没有办法测试字符串是常规的旧字符串还是表达式。

将值解析为文字会破坏表达式,但解析为表达式会强制在文本框中的值周围加上引号以获取文字值。

所以,我的问题是,如何测试一个表达式是文字字符串还是表达式?

编辑:

为了增加说明,我试图实现的最终结果是用户可以在 a 中输入文字字符串或表达式Windows.Controls.TextBox,而不必为文字值使用引号。(我尝试添加图像以使其更清晰,但我想我还没有足够的声誉,所以 ASCII 艺术将不得不这样做)。

应该出现:

  +-------------------------+          +-----------------------------+
  | Some Literal value      |    or    | foo + "Some expression"     |
  +-------------------------+          +-----------------------------+

不应显示为:(在解析为表达式时发生,即 VisualBasicValue)

  +-------------------------+          +-----------------------------+
  | "Some Literal value"    |    or    | foo + "Some expression"     |
  +-------------------------+          +-----------------------------+

不应显示为:(在解析为文字时发生,即文字)

  +-------------------------+          +-----------------------------+
  | Some Literal value      |    or    | "foo + "Some expression""   |
  +-------------------------+          +-----------------------------+
4

1 回答 1

0

从你的代码中你不能完全理解你在做什么,但我猜你在这里发明了轮子。

您使用的是普通的 WPF 文本框吗?有一个ExpressionTextBox可以完全按照您的描述进行。无需编写自定义转换器。

检查此示例:如何使用 Windows Workflow Foundation (WF4) 创建自定义活动设计器

于 2013-03-09T14:39:57.883 回答