WPF "Магия" в элементе управления PropertyGrid - PullRequest
1 голос
/ 02 августа 2009

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

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

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

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

  • Где находится код XAML или CodeBehind, который делает всю магию?

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

Ответы [ 2 ]

7 голосов
/ 02 августа 2009
  • Как узнать, какими свойствами обладает объект?

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

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

Он использует пользовательский элемент управления, называемый PropertyGrid, который выставляет ObservableCollection из Item с. Item - это просто базовый класс для объекта базовой модели, который является 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 с.

4 голосов
/ 02 августа 2009
  • Как узнать, какими свойствами обладает объект?

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

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

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

...