我正在尝试使用Winform
Property Grid
,而我无法格式化显示的值(现在与wpf
太强烈关联了)
所以我想要的是,属性网格中有一个下拉列表,它有自己的UITypeEditor
,这个编辑器显示的值如
1 - On
2 - Off
3 - Unknown
所以侦听propertyGrid更改的属性是int,由于某些奇怪的原因我无法将其更改为字符串,所以就像在wpf中一样,我可以使用转换器来转换1 into 1- On
和{{1} }?
我如何装饰我的属性或属性网格才能变得聪明?
我的财产看起来像
1-On to 1
我可以让我的属性网格显示更多信息而不仅仅是一个int吗?
答案 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);
}
}