Pregunta

Comencé un proyecto de pasatiempo para aprender sobre WPF y en mi investigación me topé con este WPF PropertyGrid http: // www.codeplex.com/wpg

Descargué la fuente de http://wpg.codeplex.com/SourceControl/ListDownloadableCommits. aspx , Y comenzó a navegar a través de él, se ve genial y funciona. Pero por mi vida, no puedo entender CÓMO funciona. Las siguientes preguntas es lo que me queda a primera vista.

  • ¿Cómo sabe qué propiedades tiene un objeto?
  • ¿Cómo representa el control para editar un Valor?
  • ¿Cómo decide qué control renderizar? (supongo que las descripciones de metadatos en las propiedades)

Entiendo que DependancyProperties maneja el intercambio de datos entre nuevos valores.

  • ¿Dónde está el código XAML o CodeBehind que hace toda la magia?

Hay un montón de código XAML en el archivo Default.xaml, pero que yo sepa, solo los estilos y las apariencias se definen allí.

¿Fue útil?

Solución

  
      
  • ¿Cómo sabe qué propiedades tiene un objeto?
  •   

Utiliza System.ComponentModel.TypeDescriptor para determinar las propiedades que tiene un tipo a través de TypeDescriptor.GetProperties . Un PropertyDescriptor proporciona una gran cantidad de información sobre cada propiedad (por ejemplo, PropertyDescriptor.IsReadOnly le dirá que una propiedad es de solo lectura). Además, utilizando PropertyDescriptor.GetValue y PropertyDescriptor.SetValue , los valores de las propiedades se pueden obtener y escribir.

  
      
  • ¿Cómo representa el control para editar un Valor?
  •   
  • ¿Cómo decide qué control renderizar? (supongo que las descripciones de metadatos en las propiedades)
  •   

Utiliza un control personalizado llamado PropertyGrid que expone un Colección Observable de Elemento s. Item es simplemente una clase base para el objeto modelo central que es Property . Property expone el tipo subyacente ( PropertyDescritor.PropertyType ) de la propiedad y expone el PropertyDescriptor.GetValue y PropertyDescriptor.SetValue métodos a través de Property.Value . Esto, a su vez, es lo que debe permitir la edición. DataTemplate s son La clave aquí. Algunos tipos de CLR tienen DataTemplate personalizados que representan los controles que ve. Por ejemplo, el tipo Boolean se representa como CheckBox mientras que un Enum se representa como ComboBox . El DataTemplate predeterminado es un TextBox .

  
      
  • ¿Dónde está el código XAML o CodeBehind que hace toda la magia?
  •   

Su propensión está en Themes \ Default.xaml .

El código se puede resumir así. Hay datos ( Data \ Property ) que encapsulan la información sobre las propiedades de un objeto y proporcionan una propiedad ( Property.Value ) para leer y escribir el valor de una propiedad. Estos datos se exponen como una ObservableCollection en un control personalizado ( PropertyGrid ) que se representa utilizando DataTemplate s en Themes \ Default.xaml .

  

Hay un montón de código XAML en el archivo Default.xaml, pero que yo sepa, solo los estilos y las apariencias se definen allí.

No pase por alto la DataTemplate s.

Otros consejos

  
      
  • ¿Cómo sabe qué propiedades tiene un objeto?
  •   

Si funciona de la misma manera que la cuadrícula de propiedades de Windows Forms, hace lo siguiente:

  • si el objeto implementa ICustomTypeDescriptor, obtenga las propiedades de esta interfaz (con el método GetProperties)
  • de lo contrario, utilice la reflexión sobre el tipo de objeto (obj.GetType (). GetProperties ()

Para las otras preguntas ... bueno, no he mirado el código, así que no puedo responder;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top