工作流程4活动设计师IValueConverter

时间:2011-01-14 14:25:13

标签: c# .net workflow-foundation-4 ivalueconverter

假设我有一个InArgument< int>的活动产品编号

我想在活动设计师中展示一个组合框,以显示所有产品,用户可以选择产品。

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

我想我需要某种ValueConverter?不确定如何为这种情况编码值转换器,如果有人有想法,建议,将会有所帮助。我必须转换InArgument< int>到一个int?并从int转换回InArgument< int>

谢谢,

2 个答案:

答案 0 :(得分: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;
    }
}

修改自this answer

答案 1 :(得分: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
}