InArgument<String>
カスタムアクティビティデザイナ(再ホスト)で使用するためにを変換しようとして問題が発生しました。float
これは、やなどのデータ型で非常にうまく機能するようになりint
ました。アイデアは、ユーザーに最も直感的な方法で設定を入力させることです。たとえばTextBox
、ユーザーを使用して、リテラル番号(つまり、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()
方法を使用してテキストボックスの値がリテラルか式かを検出できることですが、文字列が通常の古い文字列か式かをテストする方法はないようです。
値をリテラルとして解析すると式が壊れますが、式として解析すると、リテラル値のテキストボックス内の値を引用符で囲みます。
だから、私の質問は、式がリテラル文字列であるか式であるかをどのようにテストするのですか?
編集:
明確にするために、私が達成しようとしている最終結果は、ユーザーが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"" |
+-------------------------+ +-----------------------------+