我有一个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)为什么CanConvertFrom中的sourceType和ConvertFrom中的值总是字符串,尽管StandardValuesCollection属于不同的类型?看起来像PropertyGrid只使用下拉列表中元素的toString()方法并传递它。
我遇到的问题是,在“GetStandardValues”(baseDef.toString())中创建'mapping'字典与在“ConvertFrom”(value.ToString())中调用'mapping'之间的关键值密钥的实际值(在参数'value'中)可以改变(!),从而导致异常,因为找不到密钥。然而,背后的对象并没有改变!
问题#2)如何从下拉列表中获取所选对象whitout必须从字符串转换它并不总是可能(见上文)?有没有办法将此下拉框的选定索引作为某种解决方法?
非常感谢!