.net 如何在属性网格中将布尔属性显示为是|否?

.net 如何在属性网格中将布尔属性显示为是|否?,.net,winforms,propertygrid,.net,Winforms,Propertygrid,我知道我可以通过编写自定义类型描述符等来做到这一点,但是考虑到这个要求是多么简单;我错过了一个简单的方法 我只需要在BooleanConverter中设置字符串“true”和“false”,但标准的BooleanConverter似乎不允许您设置自定义字符串。您必须自定义它。像这样: class YesNoConverter : BooleanConverter { public override object ConvertTo(ITypeDescriptorContext conte

我知道我可以通过编写自定义类型描述符等来做到这一点,但是考虑到这个要求是多么简单;我错过了一个简单的方法


我只需要在BooleanConverter中设置字符串“true”和“false”,但标准的BooleanConverter似乎不允许您设置自定义字符串。

您必须自定义它。像这样:

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的帮助,无法在其他语言中实现此功能。

您可以通过使用枚举来避免实现自定义转换器:

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

实际上,这个解决方案是不可本地化的,您必须为要使用的“开/关”值对的每个排列实现一个枚举。但是,这是一次性的简单答案。

谢谢,关闭,但当我双击该值时,我得到一个错误Dlg“属性值无效”/“System.String”类型的对象无法转换为“System.Boolean”类型。在窗体上放置PropertyGrid,以便在运行时对此进行调试。您可能需要System::Convert::ToBoolean(值),而不是强制转换为bool。@Ian:GetStandardValues方法不应返回字符串数组,而应返回bool数组。由于基本布尔变换器已经完成了这项工作,您可以完全删除此方法。