在PropertyGrid中为int属性提供字符串

时间:2016-08-18 15:32:35

标签: c# propertygrid typeconverter

假设我有一个带有整数属性的类,我想在PropertyGrid中显示它。现在,PropertyGrid不应该只是显示整数值,而是显示列表中的相应字符串值,还有一个下拉列表,其中包含该属性的可能值(也作为字符串)。

我知道我必须为此使用TypeConverter,并且我过去已经为字符串属性执行了此操作。但我无法弄清楚如何做到这一点。从我的代码中可以看出,我完全无助:

class MyClassConverter : TypeConverter
{
    List<string> values = new List<string>(); 

    public MyClassConverter()
    {
        values.Add("Value1");
        values.Add("Value2");
        values.Add("Value3");
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        bool ret = true; //base.CanConvertFrom(context, sourceType);
        Debug.Print("CanConvertFrom: " + sourceType.ToString() + " " + ret.ToString());
        return ret;
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        bool ret = base.CanConvertTo(context, destinationType);
        Debug.Print("CanConvertTo: " + destinationType.ToString() + " " + ret.ToString());
        return ret;
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        Debug.Print("ConvertFrom: " + value.GetType().ToString());
        //return base.ConvertFrom(context, culture, value);
        for (int i = 0; i < values.Count; i++)
        {
            if (values[i] == value)
            {
                return i;
            }
        }
        return -1;
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        Debug.Print("ConvertTo: " + destinationType.ToString());
        return base.ConvertTo(context, culture, value, destinationType);
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        Debug.Print("GetStandardValues");
        StandardValuesCollection collection = new StandardValuesCollection(values);
        return collection;
    }

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
}

1 个答案:

答案 0 :(得分:0)

您必须以ConvertTo类型作为输入(以及隐式int类型作为输出)实现string,因为您正在与属性网格进行通信。)

此外,如果您想支持直接最终用户int输入,您还需要从ConvertFrom实施int作为string(如“2”)例子)。

以下是一段似乎有用的代码:

public class MyClassConverter : TypeConverter
{
    private List<string> values = new List<string>();

    public MyClassConverter()
    {
        values.Add("Value1");
        values.Add("Value2");
        values.Add("Value3");
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (value is int)
        {
            int index = (int)value;
            if (index >= 0 && index < values.Count)
                return values[index];

            return values[0]; // error, go back to first
        }
        return value;
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        string s = value as string;
        if (s != null)
        {
            int index = values.IndexOf(s);
            if (index >= 0)
                return index;

            // support direct integer input & validate
            if (int.TryParse(s, out index) && index >= 0 && index < values.Count)
                return index;

            return 0; // error, go back to first
        }

        return base.ConvertFrom(context, culture, value);
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        return new StandardValuesCollection(values);
    }

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
}