1

假设我有一个 InArgument<int> ProductId 的活动

我想在活动设计器中公开一个组合框来显示所有产品,并且用户可以选择一个产品。

我可以在组合中显示产品列表没问题。但是如何将所选产品绑定到我的自定义活动的 InArgument<int>?

我想我需要某种 ValueConverter?不知道如何为这种情况编写值转换器,如果有人有想法,建议会有所帮助。我必须将 InArgument<int> 转换为 int?以及从 int 转换回 InArgument<int>

谢谢,

4

2 回答 2

1

这是我尝试对此做出更通用的解决方案。我有几个属性——一些 IEnumerable、一些字符串、一些 int,并且为每个属性创建一个值转换器似乎是错误的方法。我很想知道我在这里没有发现哪些案例,因为我对 WF 比较陌生。希望这可以帮助某人。

public class ArgumentConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        object convertedValue = null;
        if(value != null)
        {
            var argumentModelItem = value as ModelItem;

            if(argumentModelItem != null)
            {
                ModelProperty argumentModelProperty = argumentModelItem.Properties["Expression"];

                if(argumentModelProperty != null && argumentModelProperty.Value != null)
                {
                    var computedValue = argumentModelProperty.ComputedValue;

                    var activity = (Activity) computedValue;
                    convertedValue = WorkflowInvoker.Invoke(activity)["Result"];
                }
            }
        }
        return convertedValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // here targetType should be InArgument<T>
        // assume a single generic argument
        Type arg0 = targetType.GetGenericArguments()[0];

        ConstructorInfo argConstructor = targetType.GetConstructor(new[] {arg0});

        var argument = argConstructor.Invoke(new[] { value });

        return argument;
    }

    #endregion
}
于 2011-09-02T21:33:45.607 回答
1
public class ArgumentToInt32Converter: IValueConverter {
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        object convertedValue = null;
        if (value != null) {
            ModelItem argumentModelItem = value as ModelItem;
            if (argumentModelItem != null && argumentModelItem.Properties["Expression"] != null && argumentModelItem.Properties["Expression"].Value != null) {
                if (argumentModelItem.Properties["Expression"].ComputedValue.GetType() == typeof(Literal <Int32> )) {
                    convertedValue = (argumentModelItem.Properties["Expression"].ComputedValue as Literal <Int32> ).Value;
                } else {
                    convertedValue = null
                }
            }
        }
        return convertedValue;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        // Convert Int32 value to InArgument<Int32>
        Int32 itemContent = (Int32) value;
        VisualBasicValue <Int32> vbArgument = new VisualBasicValue <Int32> (itemContent);
        InArgument <Int32> inArgument = new InArgument <Int32> (vbArgument);
        return inArgument;
    }
}

从此答案修改

于 2011-01-15T09:49:25.970 回答