39

我试图全面了解您如何使用 ICustomTypeDescriptor、TypeDescriptionProvider、TypeConverter 和 UITypeEditor 来更改 PropertyGrid 显示和与对象交互的方式。

有人可以告诉我这是否正确,或者我是否遗漏了任何主要概念或要点?我真的只是想了解您为什么以及何时使用每个课程。

ICustomTypeDescriptor

  • 在类中实现此接口完全覆盖类的本机属性,并用 ICustomTypeDescriptor.GetProperties() 返回的 PropertyDescriptors 替换它们

类型描述提供者

  • 用于扩展类的现有属性
  • TypeDescriptionProvider 通过 TypeDescriptionProvider 属性附加到类
  • TypeDescriptionProvider 的 GetTypeDescriptor() 方法返回要附加到该类型的现有属性的 ICustomTypeDescriptor。
  • PropertyGrid 将显示通过反射找到的类的属性,以及通过 TypeDescriptionProvider 添加到类的属性

类型转换器

  • 在类型之间转换
  • 就使用用于在属性网格中显示/编辑的复杂类型和原始类型之间转换的 PropetyGrid 而言。
  • TypeConverter 的 GetStandard values 方法也可用于在 propertygrid 中显示可能值的列表

UITypeEditor

  • 定义用于操作复杂类型属性的自定义编辑器。
  • 通过属性与属性相关联。

因此 ICustomTypeDescriptor 一个 TypeDescription 提供程序用于添加/更改/替换对象的整个属性。TypeConverter 和 UITypeEditor 应用于单个属性并控制这些特定属性的交互方式。

4

1 回答 1

38

调整:

  • TypeDescriptionProvider

    • 仍然替换元数据(不扩展)
    • 也可以添加TypeDescriptor.AddProvider
    • 可以按类型应用,也可以按实例应用,从而可以应用于列表而无需实现ITypedList
  • TypeConverter

    • 对于PropertyGrid,这也是用于获取元数据的机制;请注意,ExpandableObjectConverter只是委托给TypeDescriptor.GetProperties,但并非总是如此
    • 还负责通过更改重新创建不可变对象(例如结构)
  • UITypeEditor

    • 还负责画中的预览框PropertyGrid

额外的:

  • IExtenderProvider-附加属性;这可能是您感到困惑的地方TypeDescriptionProvider
  • ITypedList- 广义上的双胞胎ICustomTypeDescriptor,但对于列表;可以通过TypeDescriptionProvider在 any 上使用和非对象索引器来避免IList,即public T this[int index] {get;}
  • IListSource- 提供数据源和数据之间的间接性;例如,一个DataTableimplements ,在请求时IListSource返回DefaultView
于 2009-04-15T06:02:55.100 回答