【发布时间】:2011-01-12 13:43:57
【问题描述】:
我知道我可以通过编写自定义类型描述符等来做到这一点,但是考虑到这个要求是多么简单;我错过了一种简单的方法吗?
能够在 BooleanConverter 中为“true”和“false”设置字符串可能是我所需要的,但标准的 BooleanConverter 似乎不允许您设置自定义字符串。
【问题讨论】:
标签: .net winforms propertygrid
我知道我可以通过编写自定义类型描述符等来做到这一点,但是考虑到这个要求是多么简单;我错过了一种简单的方法吗?
能够在 BooleanConverter 中为“true”和“false”设置字符串可能是我所需要的,但标准的 BooleanConverter 似乎不允许您设置自定义字符串。
【问题讨论】:
标签: .net winforms propertygrid
您必须对其进行自定义。像这样:
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; }
}
按原样,此解决方案不可本地化,您必须为要使用的“开/关”值对的每个排列实现一个枚举。但是,这是一次性的简单答案。
【讨论】: