如何格式化/更改属性网格中的显示值

时间:2016-10-05 13:26:51

标签: c# .net winforms propertygrid typeconverter

我正在尝试使用Winform Property Grid,而我无法格式化显示的值(现在与wpf太强烈关联了)

所以我想要的是,属性网格中有一个下拉列表,它有自己的UITypeEditor,这个编辑器显示的值如

1 - On
2 - Off
3 - Unknown

所以侦听propertyGrid更改的属性是int,由于某些奇怪的原因我无法将其更改为字符串,所以就像在wpf中一样,我可以使用转换器来转换1 into 1- On和{{1} }?

我如何装饰我的属性或属性网格才能变得聪明?

我的财产看起来像

1-On to 1

我可以让我的属性网格显示更多信息而不仅仅是一个int吗?

1 个答案:

答案 0 :(得分:2)

如果您可以使用Enum作为属性类型,则会在下拉列表中显示可用值,否则您可以创建TypeConverter以提供下拉列表值。为此,您可以使用以下任一选项:

为您的int属性使用Enum的TypeConverter

如果值在设计时受到限制且已知,在这种情况下虽然属性为int,但您可以使用Enum的转换器作为您的属性,而不会覆盖任何内容:

public class MyObject
{
    [TypeConverter(typeof(MyTypeConverter))]
    public int MyProperty { get; set; }
}
public class MyTypeConverter : EnumConverter
{
    public MyTypeConverter() : base(typeof(MyValues)) { }
}
public enum MyValues
{
    On = 1,
    Off,
    Unknown
}

创建您自己的TypeConverter,它支持标准值

如果您无法使用枚举并且在运行时生成标准值,则可以创建此类TypeConverter

public class MyTypeConverter : TypeConverter
{
    Dictionary<int, string> values;
    public MyTypeConverter()
    {
        values = new Dictionary<int, string> { { 1, "1 - On" }, { 2, "2 - Off" }, { 3, "3 - Unknown" } };
    }
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string)) return true;
        return base.CanConvertFrom(context, sourceType);
    }
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value != null && values.ContainsValue(value.ToString()))
            return values.Where(x => x.Value == value.ToString()).FirstOrDefault().Key;
        return base.ConvertFrom(context, culture, value);
    }
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(string) && value != null && value.GetType() == typeof(int))
            return values[(int)value];
        return base.ConvertTo(context, culture, value, destinationType);
    }
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        return new StandardValuesCollection(values.Keys);
    }
}