【发布时间】:2018-03-26 21:25:19
【问题描述】:
我想问在 PropertyGrid 中实现自定义下拉列表时是否可以重用相同的 TypeConverter,但使用不同的项目。考虑使用以下 TypeConverter 在 PropertyGrid 中实现 2 项(狗/猫)下拉列表。
Public Class MyList : Inherits System.ComponentModel.StringConverter
Public items As String() = New String() {"dog", "cat"}
Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
Return New StandardValuesCollection(items)
End Function
Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
Public Overloads Overrides Function GetStandardValuesExclusive(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
Return True
End Function
End Class
这个 TypeConverter 是这样使用的:
<TypeConverter(GetType(MyList))>
Public Class MyDogAndCatList
...
End Class
我现在想重用这个相同的 TypeConverter MyList,但使用不同的列表项。例如。而不是狗/猫,我想使用牛/羊,然后定义复杂的数据类。像这样的:
cow_sheep = new MyList({"cow", "sheep"})
<TypeConverter(GetType(cow_sheep)), ...
但是这似乎是不可能的,因为 TypeConverter 必须是一个类并且不能是一个实例。我想重用 TypeConverter,因为我有很多列表要处理,我不想为每个列表定义一个新的 TypeConverter,而实际上所有重写的函数总是相同的。
我知道我可以通过基本转换器构建,然后从它继承以简化我的代码。但这仍然意味着要处理 100 多个不同的类,我认为这肯定不是正确的方法。
有人知道怎么做吗?欢迎任何帮助。提前谢谢你。
【问题讨论】:
-
您无法更改 TypeConverterAttribute,但您可以创建另一个自定义属性,其属性将定义值列表。然后您可以从您的自定义 TypeConverter 中获取该属性及其属性。
-
@Simon 谢谢。您能否用一些代码详细说明如何做到这一点?我对现代编程还很陌生,仍然停留在 80 年代的 C 语言中(但我变得更好了 :-)
-
很难理解这个问题。 TypeConverter 转换一种类型,在这两种情况下它都是 MyList。 MyList 对象具有不同的属性值绝对无关紧要。一定要让你的 TypeConverter 使用它。
-
@Hans:目前我不知道比为我的示例编写两个 TypeConverter 类更好。一个用于狗/猫列表,另一个用于牛/羊列表。每个类型转换器类都必须包含所有被覆盖的类,即使唯一改变的是列表。我怎样才能只更改列表项,而不必编写新的 TypeCONverter 类。那是我的问题。我希望这能让它更清楚。
-
为什么人们不赞成这个问题?我来这里是因为我有问题。如果你投反对票,那么至少告诉我为什么。每次投反对票都会降低声誉,从而限制了我的能力。
标签: .net propertygrid typeconverter