Как показать свойство bool как Да / нет в сетке свойств?

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

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

2 ответов


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

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; }
}

вы не получаете никакой помощи от системы.Глобализация, чтобы сделать эту работу на других языках.


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

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; }
}

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