我如何 format/Alter 在 属性 网格中显示值
How do I format/Alter displayed value in property grid
我正在尝试使用 Winform
Property Grid
,但我无法设置显示值的格式(现在注意与 wpf
的联系太紧密了)
所以我想要的是,属性 网格中有一个下拉列表,它有自己的 UITypeEditor
,此编辑器显示的值如
1 - On
2 - Off
3 - Unknown
所以监听 属性Grid 变化的 属性 是 int 并且由于一些奇怪的原因我不能将它更改为字符串,所以就像在 wpf 中一样我可以有一个转换器之类的东西转换 1 into 1- On
和 1-On to 1
?
如何将我的 属性 或 属性 网格装饰得如此智能?
我的属性长得像
[LocalizedCategory("Limits", typeof(Api.Properties.Resources))]
[LocalizedDisplayName("Maximum", typeof(Api.Properties.Resources))]
[LocalizedDescription("Maximum", typeof(Api.Properties.Resources))]
[Editor(typeof(TextConversionTypeEditor), typeof(UITypeEditor))]
public int CriticalMaximum
{
get; set;
}
我可以让我的 属性 网格显示比 int 更多的信息吗?
如果您可以使用 Enum
作为 属性 的类型,那么它会在下拉列表中显示可用值,否则您可以创建一个 TypeConverter
来为下拉列表提供值-吃下。为此,您可以使用以下任一选项:
为您的 int 使用枚举的 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);
}
}
我正在尝试使用 Winform
Property Grid
,但我无法设置显示值的格式(现在注意与 wpf
的联系太紧密了)
所以我想要的是,属性 网格中有一个下拉列表,它有自己的 UITypeEditor
,此编辑器显示的值如
1 - On
2 - Off
3 - Unknown
所以监听 属性Grid 变化的 属性 是 int 并且由于一些奇怪的原因我不能将它更改为字符串,所以就像在 wpf 中一样我可以有一个转换器之类的东西转换 1 into 1- On
和 1-On to 1
?
如何将我的 属性 或 属性 网格装饰得如此智能?
我的属性长得像
[LocalizedCategory("Limits", typeof(Api.Properties.Resources))]
[LocalizedDisplayName("Maximum", typeof(Api.Properties.Resources))]
[LocalizedDescription("Maximum", typeof(Api.Properties.Resources))]
[Editor(typeof(TextConversionTypeEditor), typeof(UITypeEditor))]
public int CriticalMaximum
{
get; set;
}
我可以让我的 属性 网格显示比 int 更多的信息吗?
如果您可以使用 Enum
作为 属性 的类型,那么它会在下拉列表中显示可用值,否则您可以创建一个 TypeConverter
来为下拉列表提供值-吃下。为此,您可以使用以下任一选项:
为您的 int 使用枚举的 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);
}
}