2010-11-22 7 views
0

Je crée une classe appelée PanelsList qui est fondamentalement TabControl sans les en-têtes en haut, donc les pages ne peuvent être modifiées que par programmation. Chaque "onglet" sera et instance d'une classe appelée PanelsListItem qui dérive de Panel. J'ai également fait une classe PanelsListItemCollection qui implémente ICollection et ICollection<PanelsListItem>. Donc, j'ajouté ce qui suit à mon PanelsList:Comment faire un UserControl avec une collection qui peut être éditée au moment du design?

private PanelsListItemCollection _Items; 

    public PanelsListItemCollection Items 
    { 
     get { return _Items; } 
     set { SetItems(value); } 
    } 

    private void SetItems(PanelsListItemCollection value) 
    { 
     if (_Items != value) 
     { 
      if (_Items != null) _Items.PanelsList= null; 
      _Items = value; 
      if (_Items != null) _Items.PanelsList= this; 
     } 
    } 

Je suppose que la construction et après l'ajout d'un PanelsList à ma forme, je serais en mesure de modifier le PanelsListItemCollection sur le temps de conception. Mais quand je clique sur le bouton « ... » sur la propriété Items dans le Proeprties éditeur, l'éditeur de collection Object ouvre mais le Ajouter et supprimer des boutons sont désactivés.

Lorsque j'ai ajouté une propriété List<Control> Stuff { get; set; } à mon PanelsList, je pouvais ajouter et supprimer des contrôles de Stuff au moment du design. Je me demande si j'ai besoin de mettre en œuvre IList au lieu de ICollection?

Modifier: J'ai juste essayé d'implémenter aussi IList<PanelsListItem> mais il ne l'a pas réparé.

Répondre

1

Pour qu'une collection soit automatiquement prise en charge par le concepteur, elle doit implémenter l'interface non générique IList - IList<T> ne fonctionnera pas automatiquement. Cela est dû au fait que l'éditeur de collection par défaut repose sur la connaissance de l'index de chaque élément. L'autre condition pour la compatibilité avec le concepteur (que votre code satisfait déjà) est que la propriété exposant votre collection doit avoir les méthodes get et set; le concepteur crée une copie temporaire de votre collection pendant l'édition, puis l'affecte à la propriété lorsque l'utilisateur clique sur OK.

Si la valeur par défaut est pas assez bon, vous pouvez mettre en œuvre votre propre éditeur de collection en étendant la classe UITypeEditor (dans l'espace de noms) et la décoration de la propriété dans votre code avec le EditorAttribute, par exemple

[Editor(typeof(MyCustomCollectionEditor), typeof(UITypeEditor))] 
public PanelsListItemCollection Items { /* ... */ } 

Vous pouvez également étendre la classe CollectionEditor existante, mais la classe n'expose des fonctionnalités très limitée aux classes dérivées.

Questions connexes