Es ist eine Klasse zu erstellen, die von WorkflowActionBaseControl erbt (siehe Basis-Infrastruktur von WorkflowActionBaseControl).

[Serializable]
[Toolbox(EnumConfigurationType.WorkflowConfigurationGuid)]
public class SetErwinAction : WorkflowActionBaseControl
{
    public SetErwinAction()
    {
        Id = new Guid("F6044D2C-BDE0-4BCE-BB64-9BA34CB81756");
        ToolboxName = "Setze Erwin";
        ControlInitName = "WorkflowActionSetErwin";
        ToolboxGroupName = Constants.Designer.ToolboxGroups.Workflow.Actions;
        Icon = Constants.Icons.Designer.Workflow.ChangeFieldAction;
    }
}

In der Klasse sind geeignete Eigenschaften für die Konfiguration der Aktion anzulegen. Beispiel:

[ComboboxControl]
[CDPOrmFieldsProperties(TypesToShow = new[] { typeof(OrmTextField) })]
[CDPDataSourceModifier]
[BARequired]
[DisplayName("Feldname")]
public String OrmFieldName { get; set; }

Für die Funktionalität für die Ausführung der Aktion ist die Methode ExecuteAction zu implementieren. Beispiel:

protected override void ExecuteAction(OrmBABase orm, LoggerToOrm logger)
{ 
    orm.Name = "Erwin";
}

Die Implementierung sollte normalerweise keine Änderungen an der Steuerelementinstanz selbst vornehmen. Ausnahmen wären Caches, die thread-safe sind und nicht persistieren.
Bitte die Regeln zum Umgang mit Workflow-Aktionen beachten.

Optional kann die Logger-Klasse, die an ExecuteAction übergeben wird, dazu genutzt werden, um zusätzliche Informationen in das allgemeine Workflow-Protokoll zu schreiben. Beispiel:

logger.AddEntry(LoggerToOrm.Translate("59155713-BADC-4F13-A886-ACF551141018", GetControlName(LoggerToOrm.LanguageCode)));

Standardmäßig wird bereits protokolliert, wenn eine Workflow-Aktion ausgeführt wird, deaktiviert ist oder es bei der Ausführung zu einer Exception kam.

Die Methode GetWFControlName muss implementiert werden. Darin muss das Control einen menschenlesbaren Text liefern, der im Designer im mittleren Bereich für das Control angezeigt werden soll und auch im Workflow-Protokoll verwendet wird.

protected override string GetWFControlName(string languageCode)

Optional kann die Methode IsValid überschrieben werden, um eine individuelle Validierung zu erreichen.

public override List<ValidationModel> IsValid(ConfigurationBase configuration, EnumDesignerValidationStateValue validationState);
{   var result = base.IsValid(configuration, validationState);
    if (blöderFehler…)
        result.Add(new ValidationModel(…));
    return result;
}