PropertyGrid控件中的WPF“Magic”

时间:2009-08-02 12:43:55

标签: wpf propertygrid

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

进行了讨论。

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

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

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

它使用名为PropertyGrid的自定义控件,该控件公开ObservableCollection Item个。 Item仅仅是核心模型对象的基类,PropertyProperty公开属性的基础类型(PropertyDescritor.PropertyType),并通过PropertyDescriptor.GetValue公开PropertyDescriptor.SetValueProperty.Value方法。反过来,这也是启用编辑的必要条件。 DataTemplates是关键所在。一些CLR类型具有自定义DataTemplate,用于呈现您看到的控件。例如,Boolean类型呈现为CheckBox,而Enum呈现为ComboBox。默认DataTemplateTextBox

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

它的倾向在Themes\Default.xaml

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

  

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

不要忽略DataTemplate s。

答案 1 :(得分:4)

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

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

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

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