2009-08-02 4 views
1

J'ai commencé un projet passe-temps pour en apprendre davantage sur WPF et dans mon Reasearch i stumpled sur ce WPF PropertyGrid http://www.codeplex.com/wpgWPF « Magic » dans un contrôle PropertyGrid

J'ai téléchargé la source de http://wpg.codeplex.com/SourceControl/ListDownloadableCommits.aspx , et commencé à naviguer à travers elle, regarde cool, et fonctionne. Mais pour la vie de moi, je ne peux pas comprendre comment cela fonctionne. Les questions suivantes sont ce qui me reste à première vue.

  • Comment sait-il quelles sont les propriétés d'un objet?
  • Comment rend-il le contrôle pour éditer une valeur?
  • Comment décide-t-il du contrôle à rendre? (Je devine des descriptions de méta-données sur les propriétés)

Je comprends que le DependancyProperties manipule le dataexchange entre de nouvelles valeurs.

  • Où est le code XAML ou CodeBehind qui fait toute la magie?

Il y a beaucoup de code XAML dans le fichier Default.xaml, mais pour autant que je sache, seuls les styles et les styles qui y sont définis sont définis.

Répondre

7
  • comment savoir quelles sont les propriétés d'un objet ont?

Il utilise System.ComponentModel.TypeDescriptor pour déterminer les propriétés qu'un type a par TypeDescriptor.GetProperties. Un PropertyDescriptor fournit une mine d'informations sur chaque propriété (par exemple, PropertyDescriptor.IsReadOnly vous dira qu'une propriété est en lecture seule). En outre, en utilisant PropertyDescriptor.GetValue et PropertyDescriptor.SetValue, les valeurs des propriétés peuvent être obtenues et écrites.

  • Comment faut-il rendre le contrôle pour modifier une valeur?
  • Comment décide-t-il du contrôle à rendre?(Je devine que les descriptions de méta-données sur les propriétés)

Il utilise un contrôle personnalisé appelé PropertyGrid qui expose une ObservableCollection de Item s. Item est simplement une classe de base pour l'objet de modèle de base qui est Property. Property expose le type sous-jacent() de la propriété et expose les méthodes PropertyDescriptor.GetValue et PropertyDescriptor.SetValue via Property.Value. Ceci, à son tour, est ce qui est lié à permettre l'édition. DataTemplates sont la clé ici. Quelques types de CLR ont des codes personnalisés DataTemplate qui affichent les contrôles que vous voyez. Par exemple, le type Boolean est rendu en tant que CheckBox tandis qu'un Enum est rendu en tant que ComboBox. La valeur par défaut DataTemplate est TextBox.

  • Où est le code XAML ou CodeBehind qui fait toute la magie?

La propension est en Themes\Default.xaml.

Le code peut être résumé ainsi. Il existe des données (Data\Property) qui encapsulent les informations sur les propriétés d'un objet et fournissent une propriété (Property.Value) pour lire et écrire la valeur d'une propriété. Ces données sont exposées en tant que ObservableCollection dans un contrôle personnalisé (PropertyGrid) qui est rendu en utilisant DataTemplate s dans Themes\Default.xaml.

Il y a beaucoup de code XAML dans le fichier Default.xaml, mais pour autant que je sache, seuls les styles et les aspects qui y sont définis sont définis.

Ne pas oublier les DataTemplate s.

4
  • comment savoir quelles sont les propriétés d'un objet ont?

Si cela fonctionne de la même façon que Windows Forms grille de la propriété, il effectue les opérations suivantes:

  • si l'objet implémente ICustomTypeDescriptor, obtenir les propriétés de cette interface (avec la méthode GetProperties)
  • autrement, la réflexion d'utilisation sur le type de l'objet (obj.GetType(). GetProperties()

Pour les autres questions ... eh bien, je h aven't regardé le code, donc je ne peux pas répondre;)

Questions connexes