Bonjour à tous.
J'ai créé un Designer semblable à celui de Visual Studio.
Il fonctionne sur la base d'un System.ComponentModel.Design.DesignSurface
Ca fonctionne très bien, j'ai tout un système pour générer le codedom, y associer du code utilisateur, un ResX, compiler le tout, etc...
J'ai donc évidemment un grille de propriété pour permettre de configurer les contrôles déposés dans la surface.
Admettons le code suivant :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public interface IBidule { // ... } public class UnControl : System.Windows.Forms.UserControl { // Propriété typée avec l'interface. public IBidule Bidule { get; set; } } public class UnAutreControl : System.Windows.Forms.UserControl, IBidule // IMPLEMENTE IBidule { }
Voila, maintenant, je pose dans ma surface une instance de chaque contrôle de chaque.
Ça me donne donc UnControl1 et UnAutreControl1.
Quand je sélectionne UnControl1, j'affecte son instance dans la grille de propriétés et celle-ci affiche automatiquement (je n'ai rien eu besoin de faire pour que ca fonctionne) les propriétés avec les bons éditeurs.
Notamment, pour la propriété Bidule, elle affiche une liste déroulante qui contient toutes les instances de contrôles qui implémentent IBidule (donc dans mon exemple, elle affiche "(Aucun)" et "UnAutreControl1").
Jusque la c'est super.
Modifions un peu le code précédent :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public class Item { public string ItemName { get; set; } public IBidule Bidule { get; set; } } public class UnControl : System.Windows.Forms.UserControl { private List<Item> _Items = new List<Item>(); public List<Item> Items { get { return _Items; } } }
Du coup, maintenant la grille affiche une propriété 'Items' avec un petit bouton '...', lorsque je clique dessus, il affiche un éditeur de collection. Le même que celui présent dans Visual Studio.
Et c'est là qu'arrive mon problème (enfin)
Pour chaque élément de la List<Item>, il affiche les propriétés et donc également la propriété "Bidule", il affecte bien une liste déroulante sur cette propriété MAIS cette liste est vide.
Comment faire pour qu'elle contienne les éléments posés sur la surface ?
Je suis ouvert à toute suggestion, j'ai été jusqu'a ré-écrire entièrement un éditeur de collection en posant des évènements sur la grille de propriété pour qu'elle utilise le mien plutot que le standard, alors même si la solution est tirée par les cheveux je la veux bien quand même ^^'.
Merci à tout ceux qui voudront bien se pencher sur mon cas![]()
Partager