WPF "Magia" in un controllo PropertyGrid
-
10-07-2019 - |
Domanda
Ho iniziato un progetto hobby per conoscere WPF e nella mia ricerca mi sono imbattuto in questa PropertyGrid WPF http: // www.codeplex.com/wpg
Ho scaricato la fonte da http://wpg.codeplex.com/SourceControl/ListDownloadableCommits. aspx E ha iniziato a sfogliarlo, sembra bello e funziona. Ma per la mia vita, non riesco a capire COME funzioni. Le seguenti domande sono: cosa mi rimane a prima vista.
- Come fa a sapere quali proprietà ha un oggetto?
- Come viene eseguito il rendering del controllo per modificare un valore?
- Come decide quale controllo rendere? (sto indovinando le descrizioni dei metadati sulle proprietà)
Comprendo che DependancyProperties gestisce lo scambio di dati tra nuovi valori.
- Dov'è il codice XAML o CodeBehind che fa tutta la magia?
C'è un sacco di codice XAML nel file Default.xaml, ma per quanto ne so sono solo gli stili e l'aspetto che sono definiti lì.
Soluzione
- Come fa a sapere quali proprietà ha un oggetto?
Utilizza System.ComponentModel.TypeDescriptor
per determinare le proprietà di un tipo tramite TypeDescriptor.GetProperties
. Un PropertyDescriptor
fornisce moltissime informazioni su ciascuna proprietà (ad es. PropertyDescriptor.GetValue
e PropertyDescriptor.SetValue
, è possibile ottenere e scrivere i valori delle proprietà.
- Come viene eseguito il rendering del controllo per modificare un valore?
- Come decide quale controllo rendere? (sto indovinando le descrizioni dei metadati sulle proprietà)
Utilizza un controllo personalizzato chiamato PropertyGrid
che espone un ObservableCollection
di Item
s. Item
è semplicemente una classe base per l'oggetto modello principale che è Proprietà
. Property
espone il tipo sottostante ( PropertyDescritor.PropertyType
) della proprietà ed espone PropertyDescriptor.GetValue
e PropertyDescriptor.SetValue
metodi tramite Property.Value
. Questo, a sua volta, è ciò che è destinato a consentire la modifica. DataTemplate
s sono la chiave qui. Alcuni tipi di CLR hanno DataTemplate
personalizzati che rendono i controlli che vedi. Ad esempio, il tipo Booleano
viene visualizzato come CheckBox
mentre un Enum
viene visualizzato come ComboBox
. Il DataTemplate
predefinito è un TextBox
.
- Dov'è il codice XAML o CodeBehind che fa tutta la magia?
La propensione è in Temi \ Default.xaml
.
Il codice può essere riassunto in questo modo. Esistono dati ( Data \ Property
) che incapsulano le informazioni sulle proprietà di un oggetto e forniscono una proprietà ( Property.Value
) per leggere e scrivere il valore di una proprietà. Questi dati sono esposti come ObservableCollection
in un controllo personalizzato ( PropertyGrid
) che viene reso utilizzando DataTemplate
in Themes \ Default.xaml
.
C'è un sacco di codice XAML nel file Default.xaml, ma per quanto ne so sono solo gli stili e l'aspetto che sono definiti lì.
Non trascurare DataTemplate
s.
Altri suggerimenti
- Come fa a sapere quali proprietà ha un oggetto?
Se funziona allo stesso modo della griglia delle proprietà di Windows Form, effettua le seguenti operazioni:
- se l'oggetto implementa ICustomTypeDescriptor, ottenere le proprietà da questa interfaccia (con il metodo GetProperties)
- altrimenti, usa la riflessione sul tipo di oggetto (obj.GetType (). GetProperties ()
Per le altre domande ... beh, non ho guardato il codice, quindi non posso rispondere;)