“Магия” WPF в элементе управления PropertyGrid

StackOverflow https://stackoverflow.com/questions/1218834

  •  10-07-2019
  •  | 
  •  

Вопрос

Я начал хобби-проект, чтобы узнать о WPF, и в своем повторном поиске я наткнулся на этот WPF PropertyGrid http://www.codeplex.com/wpg

Я скачал исходный код с http://wpg.codeplex.com/SourceControl/ListDownloadableCommits.aspx , И начал просматривать его, выглядит круто и работает.Но, хоть убей, я не могу понять, КАК это работает.Следующие вопросы - это то, с чем я остаюсь на первый взгляд.

  • Как он узнает, какими свойствами обладает объект?
  • Как он отображает элемент управления для редактирования значения?
  • Как он решает, какой элемент управления отображать?(я предполагаю, что описания метаданных в свойствах)

Я понимаю, что DependancyProperties обрабатывает обмен данными между новыми значениями.

  • Где находится код XAML или CodeBehind, который выполняет все волшебство?

В файле Default.xaml содержится много XAML-кода, но, насколько я могу судить, там определены только стили и внешний вид.

Это было полезно?

Решение

  • Как он узнает, какими свойствами обладает объект?

Он использует System.ComponentModel.TypeDescriptor чтобы определить свойства, которыми обладает тип, с помощью TypeDescriptor.GetProperties.A PropertyDescriptor предоставляет обширную информацию о каждом объекте недвижимости (например,, PropertyDescriptor.IsReadOnly сообщит вам, что свойство доступно только для чтения).Далее, используя PropertyDescriptor.GetValue и PropertyDescriptor.SetValue, значения свойств могут быть получены и записаны в.

  • Как он отображает элемент управления для редактирования значения?
  • Как он решает, какой элемент управления отображать?(я предполагаю, что описания метаданных в свойствах)

Он использует пользовательский элемент управления, называемый PropertyGrid который раскрывает ObservableCollection из Items. Item является всего лишь базовым классом для объекта core model, который является Property. Property раскрывает базовый тип (PropertyDescritor.PropertyType) собственности и раскрывает PropertyDescriptor.GetValue и PropertyDescriptor.SetValue методы с помощью Property.Value.Это, в свою очередь, то, что необходимо для включения редактирования. DataTemplates являются ключом здесь.Несколько типов CLR имеют пользовательские DataTemplateкоторые отображают элементы управления, которые вы видите.Например, в Boolean тип отображается в виде CheckBox в то время как Enum отображается в виде ComboBox.Значение по умолчанию DataTemplate является TextBox.

  • Где находится код XAML или CodeBehind, который выполняет все волшебство?

Склонность к этому заключается в Themes\Default.xaml.

Код можно резюмировать следующим образом.Есть данные (Data\Property) , который инкапсулирует информацию о свойствах объекта и предоставляет свойство (Property.Value) для чтения и записи значения свойства.Эти данные представлены в виде ObservableCollection в пользовательском элементе управления (PropertyGrid) который визуализируется с использованием DataTemplates в Themes\Default.xaml.

В файле Default.xaml содержится много XAML-кода, но, насколько я могу судить, там определены только стили и внешний вид.

Не упускайте из виду DataTemplates.

Другие советы

  • Как он узнает, какими свойствами обладает объект?

Если он работает так же, как сетка свойств Windows Forms, он выполняет следующее :

  • если объект реализует ICustomTypeDescriptor, получите свойства из этого интерфейса (с помощью метода GetProperties)
  • в противном случае используйте отражение типа объекта (obj.GetType().GetProperties()

Что касается других вопросов...ну, я не смотрел на код, так что не могу ответить ;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top