我在尝试转换InArgument<String>
用于自定义活动设计器(重新托管)时遇到问题。我已经让它非常适用于数据类型,例如float
和int
。这个想法是让用户以最直观的方式输入设置。例如,使用 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"" |
+-------------------------+ +-----------------------------+