2016-08-18 3 views
0

Предположим, у меня есть класс с целочисленным свойством, которое я хочу показать в PropertyGrid. Теперь PropertyGrid не должен просто показывать целочисленное значение, но соответствующее строковое значение из списка и далее выпадающий список с возможными значениями (также как строки) для этого свойства.Укажите строку для свойства int в 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; 
    } 
} 
+0

Quickest затруднительные бы сделать свойство типа перечисления, не так ли? –

+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; 
    } 
} 
Смежные вопросы