2011-01-14 20 views
1

可以說,我有InArgument <INT>產品編號工作流程4活動設計的IValueConverter

的活動,我想在活動設計,露出一個組合框來顯示所有的產品,用戶可以選擇產品。

我可以在組合中顯示產品列表沒有問題。但我如何綁定選定的產品到我的自定義活動的InArgument <int>?

我想我需要某種ValueConverter?不確定如何爲這種情況編碼值轉換器,如果有人有想法,建議,將會有所幫助。我必須將InRegument <int>轉換爲int?和轉換從後面的int InArgument <INT>

感謝,

回答

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

修改這是我在做一個更通用的解決方案,這樣的嘗試。我有幾個屬性 - 一些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 
} 
+0

** NOTE **:我發現上述代碼只會由於ComputedValue和工作流實例的工作方式而執行一次。但是,如果序列化活動,將其反序列化,並將新的反序列化實例傳遞到WorkflowInvoker.Invoke()中,它確實可行。 – 2011-09-07 16:01:45