WPF “Magic” em um controle PropertyGrid
-
10-07-2019 - |
Pergunta
Eu comecei um projeto de hobby para aprender sobre WPF e na minha reasearch i stumpled sobre esta WPF PropertyGrid http: // www.codeplex.com/wpg
Eu baixei a fonte de http://wpg.codeplex.com/SourceControl/ListDownloadableCommits. aspx E comecei a navegar por ele, parece legal, e obras. Mas para a vida de mim, eu não consigo descobrir como ele funciona. As perguntas a seguir é o que eu estou à esquerda com à primeira vista.
- Como se sabe quais propriedades um objeto tem?
- Como se tornar o controle para editar um valor?
- Como se decidir o controle para processar? (I estou supondo descrições de metadados sobre as propriedades)
Eu entendo as DependancyProperties alças do DataExchange entre os novos valores.
- Onde está o código XAML ou CodeBehind que faz toda a magia?
Há um monte de código XAML no arquivo Default.xaml, mas tanto quanto eu posso dizer é apenas estilos e os olhares que são definidas lá.
Solução
- Como se sabe quais propriedades um objeto tem?
Ele usa System.ComponentModel.TypeDescriptor
para determinar as propriedades que um tipo tem via TypeDescriptor.GetProperties
. A PropertyDescriptor
oferece uma riqueza de informações sobre cada propriedade (por exemplo, PropertyDescriptor.IsReadOnly
irá dizer-lhe que uma propriedade é somente leitura). Além disso, utilizando PropertyDescriptor.GetValue
e PropertyDescriptor.SetValue
, os valores das propriedades podem ser obtidas e escrita para.
- Como se tornar o controle para editar um valor?
- Como se decidir o controle para processar? (I estou supondo descrições de metadados sobre as propriedades)
Ele usa um controle personalizado chamado de PropertyGrid
que expõe um ObservableCollection
de Item
s. Item
é meramente uma classe base para o modelo de objeto do núcleo que é Property
. Property
expõe o tipo subjacente (PropertyDescritor.PropertyType
) da propriedade e expõe os métodos PropertyDescriptor.GetValue
e PropertyDescriptor.SetValue
através Property.Value
. Este, por sua vez, é o que é obrigado a para permitir a edição. DataTemplate
s são a chave aqui. Alguns tipos CLR tem DataTemplate
s personalizados que tornam os controles que você vê. Por exemplo, o tipo Boolean
é processado como uma CheckBox
enquanto um Enum
é processado como uma ComboBox
. O DataTemplate
padrão é um TextBox
.
- Onde está o código XAML ou CodeBehind que faz toda a magia?
A propensão do que é na Themes\Default.xaml
.
O código pode ser resumido como assim. Há dados (Data\Property
) que encapsula as informações sobre propriedades de um objeto e fornece uma propriedade (Property.Value
) a ler e escrever o valor de uma propriedade. Esta informação é exposta como um ObservableCollection
em um controle personalizado (PropertyGrid
) que é processado usando DataTemplate
s em Themes\Default.xaml
.
Há um monte de código XAML no arquivo Default.xaml, mas tanto quanto eu posso dizer é apenas estilos e os olhares que são definidas lá.
Não subestime a DataTemplate
s.
Outras dicas
- Como se sabe quais propriedades um objeto tem?
Se ele funciona da mesma maneira como a grade formas de propriedade do Windows, ele faz o seguinte:
- se o ICustomTypeDescriptor objeto implementa, obter as propriedades de esta interface (com o método GetProperties)
- Caso contrário, o uso de reflexão sobre o tipo do objeto (obj.GetType (). GetProperties ()
Para as outras questões ... bem, eu não olhei o código, então eu não posso responder;)