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