Come limitare un designer troppo invadente? Usando l'attributo DesignerSerializationVisibility

Per diletto sto affrontando lo sviluppo di qualche applicativo WinForm (Igor, sto approcciando il tuo "mondo", quanto tu inizierai a fare Web? ), e sono appena incorso in un problema che mi ha fatto perdere parecchio tempo:

un mio UserControl ha una proprietà con tipo un mio oggetto della class library.
Quando trascinavo il controllo nel form principale VisualStudio mi apriva un bel messagebox con un errore dicendo che non riusciva a serializzare la proprietà che fa riferimento all'oggetto in class library.

Dopo un po' di ricerca ho trovato l'attributo DesignerSerializationVisibility, che permette di specificare come si deve comportare il designer quando autogenera il codice per l'inizializzazione del controllo e di tutte le sue proprietà.

Riesce a gestire tutti i tipi base, ma quando incontra un oggetto che non riconosce genera questo errore.

Quindi, se è necessario serializzare la proprietà a design time è necessario realizzare un serializzatore custom usando CodeDom (e specificarlo usando l'attributo DesignerSerializer), ma se come nel mio caso la proprietà viene impostata solo a runtime, si può indicare al designer di non scrivere il codice di inizializzazione, usando l'attibuto DesignerSerializationVisibility e impostando la visibilità a Hidden.

//SingleRowVariableEditor.cs

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Variable Variable
{
    
get return _variable; }
    
set { _variable = value; Invalidate(); }
}

//VariableEditor.cs

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<Variable> VariableList
{
    
get
    
{
        
return _listVariables;
    }
    
set { _listVariables = value; }
}

I possibili valori sono:

  • Hidden : indica che la proprietà non deve essere persistita nel codice di inizializzazione
  • Visible : indica che la proprietà deve essere persistita nel codice di inizializzazione
  • Content : indica che la proprietà deve essere persistita inizializzando singolarmente tutte le proprietà pubbliche dell'oggetto assegnato alla proprietà

Per maggiori dettagli sull'argomento vi indico queste pagine dell'MSDN:

Designer Serialization Overview: spiega i concetti generali sulla serializzazione nel designer
DesignerSerializationVisibilityAttribute Class: la spiegazione "ufficiale" dell'attributo in questione
DesignerSerializerAttribute Class: l'attributo per specificare un proprio serializzatore
Dynamic Source Code Generation and Compilation: Cos'è CodeDom?
CodeDomSerializer Class: la classe usata per scrivere codice da programma

powered by IMHO 1.3

posted @ domenica 7 maggio 2006 15:58

Print
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011