1


我有一个 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)如何从下拉列表中获取选定的对象,而不必将其从字符串转换为并非总是可能的(见上文)?有没有办法让这个下拉框的选定索引作为某种解决方法?

非常感谢!

4

0 回答 0