35

我想了解如何使用ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor来更改PropertyGrid显示和接口与对象的方式。ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor

有人可以告诉我,如果这是正确的,或者如果我错过了任何主要的概念或观点?我真的只是想明白为什么以及何时使用每个班级。

ICustomTypeDescriptor

  • 在类实现此接口完全以覆盖一类的天然性质,并用()由ICustomTypeDescriptor.GetProperties返回的PropertyDescriptor替换它们

TypeDescriptionProvider

  • 用于在
  • 甲TypeDescriptionProvider通过TypeDescriptionProvider属性附加到一个类的类的现有属性延伸
  • 的GetTypeDescriptor()的TypeDescriptionProvider的方法返回一个ICustomTypeDescriptor为所附到现有的属性的类型。
  • 甲PropertyGrid中会同时显示通过反射发现类的属性,以及属性通过TypeDescriptionProvider

的TypeConverter

  • 类型之间进行转换
  • 在术语添加到类使用PropetyGrid用于在可以在属性网格中显示/编辑的复杂类型和基本类型之间进行转换。
  • 一个的TypeConverter的GetStandard值的方法,也可以用来显示在PropertyGrid中

UITypeEditor的

  • 定义自定义编辑器用于操作复杂的性质可能值的列表类型。
  • 通过属性与属性关联。

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

回答

36

调整菜谱方案:

  • TypeDescriptionProvider

    • 仍然取代元数据(未延伸)
    • 也可以加入是TypeDescriptor.AddProvider
    • 可以每类型可以应用以及每个实例,使其可以应用到列表而不必执行ITypedList
  • TypeConverter

    • PropertyGrid,这也是用于获得元数据的机构;注意:ExpandableObjectConverter简单地委托给TypeDescriptor.GetProperties,但是这并不总是与变化
  • UITypeEditor

    • 还负责案件
    • 还负责重新创建不可变对象(如结构)画预览框PropertyGrid

附加:

  • IExtenderProvider - 追加性能;这可能是你被混淆的东西TypeDescriptionProvider
  • ITypedList - 广泛的双胞胎ICustomTypeDescriptor,但列表;可以通过使用TypeDescriptionProvider和任何IList上的非对象索引器来避免,即,public T this[int index] {get;}
  • IListSource-提供数据源与数据之间的间接;例如,DataTable执行IListSource,当请求时返回DefaultView