Quando creiamo CustomControls, spesso
esponiamo proprietà che ritornano collection di items. Visual Studio è
abbastanza furbo da generare un Designer opportuno per creare le istanze degli
oggetti contenuti a design-time, tramite l'UITypeEditor CollectionEditor.
L'abbiamo usata migliaia di volte, si fa click su "Add"
e, detto T il tipo base di dati esposto dalla
collection, automaticamente una nuova istanza di T viene aggiunta ad essa.
Bene, ma se T fosse un tipo astratto? o se volessimo popolare tale
collection anche con tipi derivati da T? come farlo a design time?
Nulla di più semplice! Basta creare un custom UITypeEditor che derivi da CollectionEditor ed eseguire l'override del metodo CreateNewItemTypes restituendo un array di Type che
vogliamo supportare:
internal class MyCustomCollectionEditor: CollectionEditor
{
public MyCustomCollectionEditor()
:base(typeof(MyCustomCollection))
{
/* MyCustomCollection è la custom collection di cui
stiamo creando un nuovo UITypeEditor */
}
protected override Type[] CreateNewItemTypes()
{
return new Type[] { typeof(ItemType1), typeof(ItemType2),
typeof(ItemType3) };
}
}
Associamo questo nuovo editor alla collection che vogliamo
gestire
[Editor(typeof(MyCustomCollectionEditor), typeof(UITypeEditor))]
public class MyCustomCollection: List<ItemBase>
{
// ....more code here....
}
ed il gioco è fatto: ora possiamo scegliere che tipo di item inserire!
powered by IMHO 1.3