Constraining what activities can be dropped on a custom activity designer in Workflow 4

When designing a custom activity that can be used as a container for other activities, you may want to restrict the activity user to a certain set of activities.

If the custom activity can only accept a single type, this can be implemented quite simply by setting the WorkflowItemPresenter.AllowedItemType or WorkflowItemsPresenter.AllowedItemType property. Here is an example of this:

<sap:WorkflowItemsPresenter HintText="Drop Activities Here" Margin="5" MinHeight="100"Items="{Binding Path=ModelItem.Activities}"AllowedItemType="{x:Type TypeName=sa:WriteLine}">

Note that to use the above code, you'll need to add a namespace declaration to your designer:

xmlns:sa="clr-namespace:System.Activities.Statements;assembly=System.Activities"

If you need to restrict to a set of allowed activity types, rather than a single type, this can be done by adding a validation error to the validation errors collection during the CacheMetadata phase. The following example shows how to create a validation error when an activity is added to the Activities collection that is not of type WriteLine or Assign:

protected override void CacheMetadata(NativeActivityMetadata metadata){    base.CacheMetadata(metadata);    foreach (Activity a in Activities)    {        if ((a.GetType() != typeof(System.Activities.Statements.WriteLine)) && (a.GetType() != typeof(System.Activities.Statements.Assign)))        {            metadata.AddValidationError("Child activity is not of type WriteLine or Assign");        }    }}