2009-08-02 37 views
1

我开始了一个业余项目,了解WPF和我reasearch我stumpled在这个WPF的PropertyGrid http://www.codeplex.com/wpgWPF“魔术师”在PropertyGrid控件

我下载的源从http://wpg.codeplex.com/SourceControl/ListDownloadableCommits.aspx ,并开始通过它浏览,长相酷,和工作。但对于我的生活,我无法弄清楚它是如何工作的。以下问题是我第一眼看到的。

  • 它如何知道对象具有哪些属性?
  • 它如何呈现控件来编辑值?
  • 它如何决定要渲染哪个控件? (我猜元数据描述属性)

我明白DependancyProperties处理新值之间的数据交换。

  • XAML或CodeBehind代码在哪里执行所有的魔法?

Default.xaml文件中有很多XAML代码,但据我所知它只是样式和在那里定义的外观。

回答

7
  • 它怎么知道是什么属性的对象有哪些?

它使用System.ComponentModel.TypeDescriptor,以确定一个类型通过TypeDescriptor.GetProperties具有的属性。 A PropertyDescriptor提供了有关每个属性的丰富信息(例如,PropertyDescriptor.IsReadOnly会告诉您属性为只读)。此外,使用PropertyDescriptor.GetValuePropertyDescriptor.SetValue,可以获得并写入属性的值。

  • 它是如何呈现控件来编辑值?
  • 它如何决定要渲染哪个控件?(我在属性猜测元数据描述)

它使用一个自定义的控制称为PropertyGrid暴露的Item秒的ObservableCollectionItem仅仅是核心模型对象的基类,它是PropertyProperty公开该财产的基础类型(PropertyDescritor.PropertyType),并通过Property.Value公开PropertyDescriptor.GetValuePropertyDescriptor.SetValue方法。反过来,这也是启用编辑的必要条件。 DataTemplates是这里的关键。一些CLR类型具有呈现您看到的控件的自定义DataTemplate。例如,Boolean类型呈现为CheckBoxEnum呈现为ComboBox。默认DataTemplateTextBox

  • XAML或CodeBehind代码在哪里做了所有的魔术?

它的倾向是Themes\Default.xaml

代码可以总结为如此。有数据(Data\Property)封装了有关对象属性的信息,并提供了属性(Property.Value)来读取和写入属性的值。该数据在自定义控件(PropertyGrid)中以ObservableCollection的形式公开,该自定义控件使用DataTemplateThemes\Default.xaml中呈现。

Default.xaml文件中有很多XAML代码,但据我所知它只是样式和在那里定义的外观。

不要忽视DataTemplate s。

4
  • 它如何知道对象具有哪些属性?

如果它会像Windows窗体属性网格以同样的方式,它执行以下操作:

  • 如果对象实现ICustomTypeDescriptor,获得这个接口的属性(用的GetProperties方法)
  • 否则,在对象的类型(obj.GetType()使用反射。的GetProperties()

对于其他问题......好吧,I H aven't看了看代码,所以我不能回答;)