我有一个 PropertyGrid 用于一个类,该类具有我想使用现有的合适值列表填充的属性。
为了实现这一点,我像这样扩展 TypeConverter 以显示一个下拉列表:
public class BaseDefinitionTypeConverter : TypeConverter
{
protected Dictionary<string, BaseDefinitionWrapper> mapping = new Dictionary<string, BaseDefinitionWrapper>();
public override bool GetStandardValuesSupported(ITypeDescriptorContext context) {
return true; // display drop
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) {
return true; // drop-down vs combo
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) {
mapping.Clear();
//Since everything is passed in as string a conversion is needed. "mapping" provides for that
foreach (BaseDefinitionWrapper baseDef in BaseDefinitionWrapper.allWrappers) {
mapping.Add(baseDef.ToString(), baseDef);
}
return new StandardValuesCollection(BaseDefinitionWrapper.allWrappers);
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
//sourceType is ALWAYS string
return sourceType == typeof(string);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {
//returns the actual selected object to the property grid. value is ALWAYS string.
return mapping[value.ToString()];
}
}
像这样使用:
[TypeConverter(typeof(BaseDefinitionTypeConverter))]
public BaseDefinitionTypeWrapper XYZ {
get; set;
}
您可以看到我的后备列表是 BaseDefinitionWrapper.allWrappers。
问题 #1) 为什么尽管 StandardValuesCollection 的类型不同,但 CanConvertFrom 中的 sourceType 和 ConvertFrom 中的 value 始终是字符串?似乎 PropertyGrid 仅使用下拉列表中元素的 toString() 方法并将其传递。
我有一个问题,在“GetStandardValues”(baseDef.toString())中创建“映射”字典和在“ConvertFrom”(value.ToString())中调用“映射”之间的关键值是键(在参数“值”中)可以更改(!)因此导致异常,因为找不到键。然而后面的对象并没有改变!
问题 #2)如何从下拉列表中获取选定的对象,而不必将其从字符串转换为并非总是可能的(见上文)?有没有办法让这个下拉框的选定索引作为某种解决方法?
非常感谢!