[WF4] Retrouver les variables accessibles

Publié le 02 février 2010 par Jeremy.jeanson

Dernièrement j’ai eu à travailler sur une problématique plutôt intéressante : lister dans le designer d’une activité l’ensemble des variables qu’elle aux quelle elle peut accéder.

Pour comprendre le code il faut bien assimiler le fait que le designer d’une activité n’accède pas directement à son activité, mais à un ModelItem qui la représente. Donc pour trouver les activité contenant l’activité courante, il faut remonter l’arbre de ces ModelItem et demander à chacun si il a des variables.

Dit comme cela tout est simple… mais voyer par vous même la méthode GetVariables(ModelItem) que voici :

C#

public static class VariablesHelper
{
    // Nom de la propriété "Varaibles" (Collection des varaibles d'une séquence
    public const String VariablesPropertyName = "Variables";

    #region "Retrouver les variables accessibles via un ModelItem"

    /// <summary>
    /// Retourne la liste des variables accessible via un ModelItem
    /// </summary>
    /// <param name="modelItem"></param>
    /// <returns></returns>
    public static List<Variable> GetVariables(ModelItem modelItem)
    {
        // Création
        List<Variable> variables = new List<Variable>();

        // Test si on a un item
        if (modelItem != null)
        {
            // Si oui mise à jour de la liste
            GetVariables(modelItem, variables);

            // Affectation de la liste des variables
            return variables
                .OrderBy(c => c.Name)
                .ToList();
        }
        else
        {
            // La liste ne peut pas être peuplée, 
            // elle restera donc vide
            // Affectation de la liste des variables
            return variables;
        }

    }

    /// <summary>
    /// Alimente la liste des variables accessible via un ModelItem
    /// </summary>
    /// <param name="modelItem"></param>
    private static void GetVariables(ModelItem modelItem, List<Variable> variables)
    {
        // Test si on a un scop de variables
        if (modelItem.Properties
            .Any(c =>
                c.Name == VariablesHelper.VariablesPropertyName
                & c.PropertyType == typeof(Collection<Variable>)))
        {
            // R2cupération de la collection de variable et parcour des varaibles
            (modelItem.Properties[VariablesHelper.VariablesPropertyName].Value.GetCurrentValue() as Collection<Variable>)
                .ToList()
                .ForEach(c => variables.Add(c));
        }

        // Test si on a un parent
        if (modelItem.Parent != null)
        {
            GetVariables(modelItem.Parent, variables);
        }
    }

    #endregion
}

Note : Pour l’utiliser il suffit de passer la propriété ModeItem de votre Designer d’activité.