为什么TypeConverter.CanConvertFrom总是在'sourceType'中提供'string'?

时间:2012-11-08 18:12:37

标签: c# winforms propertygrid typeconverter


我有一个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必须从字符串转换它并不总是可能(见上文)?有没有办法将此下拉框的选定索引作为某种解决方法?

非常感谢!

0 个答案:

没有答案