Workflow Foundation 4.0 is introduced a significant amount of change in the Activity Designer. In WF4.0, Activity Designers are defined using WPF. Property management and display is one of the important aspects of a custom Activity Designer.
Introduction
Workflow Foundation 4.0 is introduced a significant amount of change in the Activity Designer. In WF4.0, Activity Designers are defined using WPF. Property management and display is one of the important aspects of a custom Activity Designer. We can use the PropertyValueEditor for providing meaningful editor for the Property. Also, we can use the TypeConverters for providing the expected values of a property.
Wf4.0 is using the WPF Type Converters. In this article we will discuss about the WPF TypeConverter and how we can use the same in WF4.0 custom activity.
Type Converter
Type Converters are used to pre-populate the expected values of a Property. We can either allow the user to edit new values or can restrict the user to only select from the given values using Type Converter.
Let us look into a simple Type converter to populate the WorkingDay property. Our Type Converter is inherited from StringConverter and we override three methods.
As we override the GetStandardValuesExclusive() method and return true, this Type Converter restrict the user only to select values from the list. If it return false or not overridden, then it display the list and also allow the user to enter another value.
Type Converter
public class WorkingDayConverter : StringConverter
{
private static StandardValuesCollection svc;
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
ArrayList values = new ArrayList();
values.Add("Monday");
values.Add("Tuesday");
values.Add("Wednesday");
values.Add("Thursday");
values.Add("Friday");
svc = new StandardValuesCollection(values);
return svc;
}
}
Our TestActivity looks like
public class TestActivity:CodeActivity
{
private string day;
[TypeConverterAttribute(typeof(WorkingDayConverter))]
[BrowsableAttribute(true)]
public string WorkingDay
{
get
{
return this.day;
}
set
{
this.day = value;
}
}
protected override void Execute(CodeActivityContext context)
{
MessageBox.Show(WorkingDay);
}
}
Workflow Designer will look like
Extracting Workflow Data
In the next sample, we will how to extract another activity data. For our sample Type Converter, I am populating the names of all WriteLine activities exist in our workflow. As I am not overriding the GetStandardValuesExclusive method, we can enter the values against the Property too.
Type Converter
internal class WriteLineConverter : StringConverter
{
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
ModelService modelService = (ModelService)context.GetService(typeof(ModelService));
IEnumerable<ModelItem> activityCollection = modelService.Find(modelService.Root, typeof(WriteLine));
ArrayList writeLines = new ArrayList();
foreach (ModelItem shv in activityCollection)
{
writeLines.Add((shv.GetCurrentValue() as WriteLine).DisplayName);
}
return new StandardValuesCollection(writeLines);
}
}
Property in Test Activity
private string wrLine;
[TypeConverterAttribute(typeof(WriteLineConverter))]
[BrowsableAttribute(true)]
public string WriteLinenames
{
get
{
return this.wrLine;
}
set
{
this.wrLine = value;
}
}
Workflow Designer
Conclusion
WF4.0 Activity designers are defined using WPF. WPF integration gives full support for customization of our custom designer. In this article we discussed about the Type Converters used as part of custom properties in Activity Designer.