ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor
我想要全面了解如何使用ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor来更改PropertyGrid显示和与对象接口的方式。
有人能告诉我这是对的吗,还是我错过了一些重要的概念或观点? 我真的只是想明白为什么和什么时候你会使用每个类。
ICustomTypeDescriptor
- 在类中全部实现此接口将覆盖类的本地属性,并将其replace为由ICustomTypeDescriptor.GetProperties()返回的PropertyDescriptors。
TypeDescriptionProvider
- 用于扩展一个类的现有属性
- TypeDescriptionProvider通过TypeDescriptionProvider属性附加到类
- TypeDescriptionProvider的GetTypeDescriptor()方法返回一个ICustomTypeDescriptor以附加到该types的现有属性。
- PropertyGrid将显示通过Reflectionfind的类的属性,以及通过TypeDescriptionProvider添加到类的属性
types转换器
- types之间转换
- 就使用PropetyGrid而言,可以在属性网格中显示/编辑复杂types和基本types之间进行转换。
- TypeConverter的GetStandard值方法也可以用来显示propertygrid中可能值的列表
UITypeEditor的
- 定义一个用于处理复杂types属性的自定义编辑器。
- 通过属性关联属性。
所以ICustomTypeDescriptor是一个TypeDescription提供程序,用于添加/更改/replace对象的整个属性。 TypeConverter和UITypeEditor应用于各个属性,并控制这些特定属性的接口方式。
调整:
- 
TypeDescriptionProvider- 仍然取代元数据(不扩展)
-  也可以添加TypeDescriptor.AddProvider
-  可以应用于每个types以及每个实例,使得可以应用于列表而不必实施ITypedList
 
- 
TypeConverter-  对于PropertyGrid,这也是用于获取元数据的机制; 请注意,ExpandableObjectConverter只是委托给TypeDescriptor.GetProperties,但事实并非总是如此
- 还负责重新创build具有更改的不可变对象(如结构)
 
-  对于
- 
UITypeEditor-  还负责绘制PropertyGrid的预览框
 
-  还负责绘制
额外:
-   IExtenderProvider– 附加属性; 这可能是你与TypeDescriptionProvider混淆
-   ITypedList– 广泛的ICustomTypeDescriptor的孪生,但对于列表; 可以通过在任何IList上使用TypeDescriptionProvider和非对象索引器来避免,例如public T this[int index] {get;}
-   IListSource– 在数据源和数据之间提供间接性; 例如,DataTable实现IListSource,在请求时返回DefaultView