Как показать свойство bool как Yes | No в сетке свойств?

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

Возможность установки строки для "true" и "false" в BooleanConverter может быть всем, что мне нужно, но стандартный BooleanConverter, похоже, не позволяет вам настраивать строки.

Ответ 1

Вам придется настроить его. Вот так:

class YesNoConverter : BooleanConverter {
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) {
        if (value is bool && destinationType == typeof(string)) {
            return values[(bool)value ? 1 : 0];
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) {
        string txt = value as string;
        if (values[0] == txt) return false;
        if (values[1] == txt) return true;
        return base.ConvertFrom(context, culture, value);
    }

    private string[] values = new string[] { "No", "Yes" };
}

Использование образца:

class MyControl : Control {
    [TypeConverter(typeof(YesNoConverter))]
    public bool Prop { get; set; }
}

Вы не получаете помощи от System.Globalization, чтобы сделать эту работу на других языках.

Ответ 2

Вы можете избежать реализации пользовательского конвертера с помощью перечисления:

public enum YesNo{No,Yes}

...

[Browsable(true)]
public YesNo IsValueSet {get;set)

[Browsable(false)] //also consider excluding it from designer serialization
public bool ValueSetAsBool 
{
   get { return Convert.ToBoolean((byte)IsValueSet); }
   set { IsValueSet = value ? YesNo.Yes : YesNo.No; }
}

Как и в случае, это решение не является локализуемым, и вам нужно будет реализовать перечисление для каждой перестановки пар значений "Вкл/Выкл", которые вы хотели использовать. Но это простой ответ для одноразового использования.