1

Я пытаюсь реализовать локализованный BooleanConverter. Все работает хорошо до сих пор, но когда вы дважды щелкните в собственности появится следующее сообщение:Пользовательский локализованный BooleanConverter

«Объект типа« System.String »не может быть преобразован в тип« System.Boolean ».»

Я предполагаю, что проблема заключается в методе CreateInstance TypeConverter, который имеет это логическое свойство.

public class BoolTypeConverter : BooleanConverter 
{ 
    private readonly string[] values = { Resources.BoolTypeConverter_False, Resources.BoolTypeConverter_True }; 

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     if (destinationType == typeof(string) && value != null) 
     { 
      var valueType = value.GetType(); 

      if (valueType == typeof(bool)) 
      { 
       return values[(bool)value ? 1 : 0]; 
      } 
      else if (valueType == typeof(string)) 
      { 
       return value; 
      } 
     } 

     return base.ConvertTo(context, culture, value, destinationType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     var stringValue = value as string; 

     if (stringValue != null) 
     { 
      if (values[0] == stringValue) 
      { 
       return true; 
      } 
      if (values[1] == stringValue) 
      { 
       return false; 
      } 
     } 

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

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

ответ

1

Основная проблема вашего кода переопределение GetStandardValues неправильно.

На самом деле вам не нужно переопределить GetStandardValues, просто удалите его, и вы получите ожидаемый результат, который действует как оригинальный булевой преобразователь, показывая свои нужные строки:

enter image description here

При переопределении GetStandardValues вам должен возвращать список поддерживаемых значений типа, для которого вы создаете конвертер, а затем с помощью ConvertTo вы предоставляете значения строкового представления и используя ConvertFrom, предоставьте способ преобразования типа из строковых значений.