【问题标题】:workflow 4 activity designer IValueConverter工作流 4 活动设计器 IValueConverter
【发布时间】:2011-01-14 14:25:12
【问题描述】:

假设我有一个使用 InArgument ProductId 的活动

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

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

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

谢谢,

【问题讨论】:

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


    【解决方案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

    【讨论】:

      【解决方案2】:

      这是我尝试对此做出更通用的解决方案。我有几个属性——一些 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
      }
      

      【讨论】:

      • 注意:由于ComputedValue 和工作流实例的工作方式,我发现上面的代码只会执行一次。但是,如果您对活动进行序列化、反序列化并将新的反序列化实例传递给WorkflowInvoker.Invoke(),它确实有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多