Lors de l’ajout de votre activité dans le Designer, vous pouvez être amené à chercher un scope de variables afin d’y effectuer quelques opérations (ajout, suppression, consultation …). La méthode décrite ici considère donc que vous êtes dans l’ActivityDesigner de votre activité. Vous allez donc pouvoir utiliser le ModelItem de votre activité afin de parcourir votre workflow durant son édition.

Pour parcourir un Workflow à partir du ModelItem d’un ActivityDesigner les choses sont relativement simples car un ModelItem à une propriété Parent. Ce Parent est le ModelItem parent du ModelItem. On peut donc parcourir un workflow via les proxys des activités qui s’y trouvent. En soit rien de bien compliqué donc.

Les scopes étant des collections de variables publiques, il suffit de trouver une activités qui expose une propriété de ce type et qui soit nommée “Variables”.

D’où le code de la méthode GetFirstParentWithVariables qui suit:

Vb

''' <summary>
Internal Class VariablesHelper

' Nom de la propriété "Variables"
Private Const VariablesPropertyName As String = "Variables"

''' Retouner le premier parent pouvant contenir des variables
''' </summary>
''' <param name="modelItem"></param>
''' <returns></returns>
Public Shared Function GetFirstParentWithVariables(ByVal modelItem As ModelItem) As ModelItem

    ' Test si on trouve une liste de propriétés
    If (modelItem.Properties _
        .Any(Func(c) _
            c.Name = VariablesHelper.VariablesPropertyName _
            AndAlso c.PropertyType Is GetType(Collection(Of Variable))))
    
        Return modelItem

    End If

    ' Test si on a un parent
    If (modelItem.Parent IsNot Empty)
    
        return GetFirstParentWithVariables(modelItem.Parent)
    
    Else

        return Nothing

    End If

End Function

End Class

C#

/// <summary>
internal static class VariablesHelper
{
// Nom de la propriété "Variables"
private const String VariablesPropertyName = "Variables";

/// Retouner le premier parent pouvant contenir des variables
/// </summary>
/// <param name="modelItem"></param>
/// <returns></returns>
public static ModelItem GetFirstParentWithVariables(ModelItem modelItem)
{
    // Test si on trouve une liste de propriétés
    if (modelItem.Properties
        .Any(c =>
            c.Name == VariablesHelper.VariablesPropertyName
            && c.PropertyType == typeof(Collection<Variable>)))
    {
        return modelItem;
    }

    // Test si on a un parent
    if (modelItem.Parent != null)
    {
        return GetFirstParentWithVariables(modelItem.Parent);
    }
    else
    {
        return null;
    }
}