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é.