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