PropertyGrid控件中的WPF"Magic"

thm*_*msn 1 wpf propertygrid

我开始了一个业余爱好项目,以了解WPF,在我的研究中,我对这个WPF PropertyGrid http://www.codeplex.com/wpg进行了讨论.

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

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

我理解DependancyProperties处理新值之间的dataexchange.

  • XAML或CodeBehind代码在哪里可以完成所有的魔术?

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

jas*_*son 7

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

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

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

它使用一个称为自定义控件PropertyGrid暴露的ObservableCollectionItem秒.Item它只是核心模型对象的基类Property.Property公开PropertyDescritor.PropertyType属性的底层type()并公开PropertyDescriptor.GetValuePropertyDescriptor.SetValue方法via Property.Value.反过来,这也是启用编辑的必要条件.DataTemplates是关键.一些CLR类型具有自定义DataTemplates,可以呈现您看到的控件.例如,Boolean类型呈现为CheckBoxwhile,Enum呈现为a ComboBox.默认DataTemplate值为a TextBox.

  • XAML或CodeBehind代码在哪里可以完成所有的魔术?

它的倾向是在Themes\Default.xaml.

代码可以如此概括.data(Data\Property)封装了有关对象属性的信息,并提供了一个property(Property.Value)来读取和写入属性的值.此数据ObservableCollectionPropertyGrid使用DataTemplates in 呈现的自定义控件()中公开Themes\Default.xaml.

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

不要忽视DataTemplates.