1

我开始了一个爱好项目来了解 WPF,在我的研究中我偶然发现了这个 WPF PropertyGrid http://www.codeplex.com/wpg

我从http://wpg.codeplex.com/SourceControl/ListDownloadableCommits.aspx下载了源代码 ,然后开始浏览它,看起来很酷,而且可以工作。但是对于我的生活,我无法弄清楚它是如何工作的。乍一看,以下问题是我留下的。

  • 它如何知道对象具有哪些属性?
  • 它如何呈现控件以编辑值?
  • 它如何决定渲染什么控件?(我猜测属性上的元数据描述)

我了解 DependancyProperties 处理新值之间的数据交换。

  • 发挥所有魔力的 XAML 或 CodeBehind 代码在哪里?

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

4

2 回答 2

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

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

  • 它如何呈现控件以编辑值?
  • 它如何决定渲染什么控件?(我猜测属性上的元数据描述)

它使用一个名为 a 的自定义控件PropertyGrid,它公开了一个ObservableCollectionof Items。Item只是核心模型对象的基类,即Property. Property公开属性的底层类型 ( PropertyDescritor.PropertyType) 并通过 公开PropertyDescriptor.GetValuePropertyDescriptor.SetValue方法Property.Value。反过来,这必然会启用编辑。DataTemplates是这里的关键。一些 CLR 类型具有DataTemplate呈现您看到的控件的 custom 。例如,Boolean类型被呈现为CheckBoxwhileEnum被呈现为 a ComboBox。默认DataTemplate值为TextBox.

  • 发挥所有魔力的 XAML 或 CodeBehind 代码在哪里?

它的倾向在Themes\Default.xaml.

代码可以这样概括。有 data ( Data\Property) 封装了有关对象属性的信息,并提供了 property ( Property.Value) 来读取和写入属性的值。此数据显示为ObservableCollection自定义控件 ( ) 中的一个,该控件使用s inPropertyGrid呈现。DataTemplateThemes\Default.xaml

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

不要小看DataTemplates。

于 2009-08-02T13:25:01.537 回答
4
  • 它如何知道对象具有哪些属性?

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

  • 如果对象实现了 ICustomTypeDescriptor,则从此接口获取属性(使用 GetProperties 方法)
  • 否则,对对象的类型使用反射 (obj.GetType().GetProperties()

对于其他问题......好吧,我没有看过代码,所以我无法回答;)

于 2009-08-02T12:59:55.327 回答