рабочий процесс 4 деятельность дизайнера IValueConverter - PullRequest
1 голос
/ 14 января 2011

Допустим, у меня есть активность с InArgument ProductId

Я бы хотел, чтобы в конструкторе действий появился список со списком, чтобы показать все продукты, и пользователь может выбрать продукт.

Я могу показать список продуктов в комбо без проблем. Но как мне связать выбранный продукт с InArgument моей пользовательской активности?

Полагаю, мне нужен какой-нибудь ValueConverter? Не уверен, как кодировать преобразователь значений для этого случая, если у кого-то есть идея, предложение будет полезно. Я должен преобразовать InArgument в int? и конвертировать обратно из int в InArgument

Спасибо

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Это моя попытка сделать более общее решение для этого.У меня есть несколько свойств - некоторые 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
}
1 голос
/ 15 января 2011
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;
    }
}

Изменено с этот ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...