Anche se magari non ve ne rendete conto, utilizzate il controllo PropertyGrid tutte le volte che premete F4 all'interno dell'IDE di Visual Studio 2005. La PropertyGrid non è nient'altro che il componente .NET che implementa la Property Window dell'IDE. La cosa interessante è che possiamo utilizzarla all'interno dei nostri progetti .NET.
La PropertyGrid mostra tutte le proprietà di un oggetto managed nello stesso identico modo attuato dalla Property Window. E' sufficiente impostare la proprietà SelectedObject (o SelectedObjects per più oggetti contemporaneamente) esposta da questo controllo. La PropertyGrid rifletterà automaticamente questa impostazione, mostrando le proprietà dell'oggetto. Attraverso l'interfaccia, possiamo personalizzarne e controllarne l'aspetto.
La proprietà PropertySort permette di impostare attraverso l'enum omonimo la modalità di visualizzazione che deve assumere la PropertyGrid (alfabetica, per categorie od entrambe), esattamente come accade nell'IDE. Le proprietà ViewBackColor e ViewForeColor permettono di impostare rispettivamente il colore di sfondo e del testo nella PropertyGrid. La proprietà CategoryForeColor regola il colore del testo utilizzato nelle barre relative alla categoria. Una cosa importante: quando si cambia una proprietà dell'oggetto referenziato da SelectedObject, il cambiamento non si riflette automaticamente nella PropertyGrid - per farlo, è necessaria una chiamata al metodo Refresh. Il metodo ExpandAllGridItems espande automaticamente tutti gli elementi che possono essere espansi (leggesi: categorie oppure proprietà complesse, come Size, Location, Font - tutte derivate da Control).
Personalmente, ho utilizzato questo controllo all'interno di Happy Sign (adesso è stato rimosso) per consentire all'utente di cambiare le Signature senza troppe complicazioni, proprio perchè potete usare questo controllo con qualsiasi oggetto, compresi quelli del vostro domain model.
Gli eventi della PropertyGrid
La Property Grid espone un certo numero di eventi. Tra i più interessanti segnalo:
- SelectedGridItemChanged, per reagire quando cambiamo riga (e quindi proprietà selezionata) all'interno della PropertyGrid
- SelectedObjectsChanged, per reagire quando cambia la proprietà SelectedObject
- PropertyValueChanged, per reagire quando cambiamo il valore di una proprietà all'interno della PropertyGrid
L'evento SelectedGridItemChanged utilizza la classe GridItem che, per dirla come la dice MSDN, implements one row in a PropertyGrid. GridItem espone la proprietà Expandable, che ci dice se la riga può essere espansa per mostrare le subproperties della proprietà selezionata: questo accade, per esempio, quando selezioniamo Size, che espone Width ed Height. La trovo però una spiegazione non sufficiente, perchè Expandable ritorna true anche quando selezioniamo una categoria, per cui stiamo attenti. La proprietà Label ci ritorna la caption della riga corrente, mentre Value il valore della proprietà (intesa come object, com'è ovvio che sia).
L'evento SelectedObjectsChanged non ha nulla di particolare da segnalare.
L'evento PropertyValueChanged viene sollevato quando modifichiamo il valore di una proprietà. L'event handler, oltre al classico object sender a cui siamo abituati, utilizza la classe PropertyValueChangedEventArgs che espone il membro ChangedItem che non è nient'altro che il GridItem sul quale abbiamo fatto la modifica. La proprietà OldValue invece è un object che contiene il vecchio valore, prima della modifica.
PropertyGrid? Conoscere bene anche il namespace System.ComponentModel!
Utilizzare la PropertyGrid senza conoscere un po' il namespace System.ComponentModel è quasi inutile. Questo namespace contiene l'implementazione di un certo numero di classi Attribute molto utili a questo scopo. Ricordo ancora (a grandi linee, non esageriamo) la sessione di Corrado datata 14 Luglio 2005, durante la quale si vedeva come creare Windows Control. Quel giorno vedemmo come creare Windows Control capaci di esporre/ordinare/organizzare le loro proprietà in modo efficiente. Le stesse logiche sono valide anche in questo contesto, ovviamente, perchè alla fin fine - come ho detto prima - la PropertyGrid è lo stesso identico controllo dell'IDE di VS2005. Per esempio, utilizzare CategoryAttribute permette di posizionare una certa proprietà all'interno di una categoria di nostra scelta. L'attributo DefaultValueAttribute permette di impostare il valore di default di una certa proprietà; alla PropertyGrid serve per sapere quando deve utilizzare il grassetto nell'indicare il valore stesso (e per sapere quando serializzare il codice nel nomeform.Designer.cs). DescriptionAttribute serve per indicare una descrizione per una certa proprietà, che appare nella parte inferiore della PropertyGrid. In generale, quindi, tutto il meccanismo da studiare per costruire controlli per un certo grado di user-experience a design-time (editor custom per una determina proprietà) viene applicato anche con la PropertyGrid.
Ricordiamoci che l'esame 70-526 ci tartassa anche sullo sviluppo di controlli per Windows Forms (sia da zero che ereditati da controlli .NET standard): sapere bene il System.ComponentModel quindi non riguarda solo la PropertyGrid, ma può fare la differenza tra passare e non passare l'esame!