“Магия” WPF в элементе управления PropertyGrid
-
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
из Item
s. Item
является всего лишь базовым классом для объекта core model, который является Property
. Property
раскрывает базовый тип (PropertyDescritor.PropertyType
) собственности и раскрывает PropertyDescriptor.GetValue
и PropertyDescriptor.SetValue
методы с помощью Property.Value
.Это, в свою очередь, то, что необходимо для включения редактирования. DataTemplate
s являются ключом здесь.Несколько типов CLR имеют пользовательские DataTemplate
которые отображают элементы управления, которые вы видите.Например, в Boolean
тип отображается в виде CheckBox
в то время как Enum
отображается в виде ComboBox
.Значение по умолчанию DataTemplate
является TextBox
.
- Где находится код XAML или CodeBehind, который выполняет все волшебство?
Склонность к этому заключается в Themes\Default.xaml
.
Код можно резюмировать следующим образом.Есть данные (Data\Property
) , который инкапсулирует информацию о свойствах объекта и предоставляет свойство (Property.Value
) для чтения и записи значения свойства.Эти данные представлены в виде ObservableCollection
в пользовательском элементе управления (PropertyGrid
) который визуализируется с использованием DataTemplate
s в Themes\Default.xaml
.
В файле Default.xaml содержится много XAML-кода, но, насколько я могу судить, там определены только стили и внешний вид.
Не упускайте из виду DataTemplate
s.
Другие советы
- Как он узнает, какими свойствами обладает объект?
Если он работает так же, как сетка свойств Windows Forms, он выполняет следующее :
- если объект реализует ICustomTypeDescriptor, получите свойства из этого интерфейса (с помощью метода GetProperties)
- в противном случае используйте отражение типа объекта (obj.GetType().GetProperties()
Что касается других вопросов...ну, я не смотрел на код, так что не могу ответить ;)