强制 UITypeEditor 显示枚举类型的初始值
Force UITypeEditor to display a initial value for a Enum type
我有一个 class,名称为 EnumFlagsEditor
,它继承自 UITypeEditor in order to design a type editor capable to edit a Enum with FlagsAttribute, by using a custom CheckedListBox,并且还能够在同一个自定义编辑器中编辑普通枚举。
在覆盖的 UITypeEditor.GetEditStyle 方法中,我验证源 Enum 是否设置了 FlagsAttribute
。如果枚举类型有这个属性 class,那么我 return UITypeEditorEditStyle.DropDown
显示我的自定义 CheckedListBox
。如果没有,我 return UITypeEditorEditStyle.Modal
和 .NET Framework 使用默认编辑器编辑枚举,使用默认 ComboBox
显示和 select 枚举 values/names.
问题是,.NET framework class 库中的默认内置编辑器用于编辑普通枚举,我注意到它会搜索值为 0 的枚举名称以将其显示为默认值,如果它没有找到它,抛出一个 System.ArgumentException
并且不显示默认值。
以这个枚举为例:
public enum TestEnum {
a = 1,
b = 2,
c = 4
}
这将在 属性 网格的编辑器中抛出一个 System.ArgumentException
并且不会显示默认值,因为 Enum 的默认 .NET Framework 编辑器期望 Enum 中的值为 0 ...
现在,使用 System.DayOfWeek 枚举来查看差异:
DayOfWeek.Sunday
(0) 默认为 select,因此会抛出任何异常。
然后,在我的 EnumFlagsEditor
class 中,我想阻止这种行为。我希望编辑器在 属性 网格中为我的编辑器显示一个默认值。我不关心异常,但我想显示一个特定的初始值...更准确地说,是源枚举中定义的最小值。
我该怎么做?
这不是 UITypeEditor 问题,而是 TypeConverter issue. What you can do is derive from the standard EnumConverter class,像这样:
[TypeConverter(typeof(MyEnumConverter))]
public enum TestEnum
{
a = 1,
b = 2,
c = 4
}
public class MyEnumConverter : EnumConverter
{
public MyEnumConverter(Type type)
: base(type)
{
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
try
{
return base.ConvertTo(context, culture, value, destinationType);
}
catch
{
if (destinationType == typeof(string))
{
// or whatever you see fit
return "a";
}
throw;
}
}
}
PS:你可以避免异常捕获并进行自己的转换,但它可能比一般情况下看起来更难(取决于枚举底层类型等)。
我有一个 class,名称为 EnumFlagsEditor
,它继承自 UITypeEditor in order to design a type editor capable to edit a Enum with FlagsAttribute, by using a custom CheckedListBox,并且还能够在同一个自定义编辑器中编辑普通枚举。
在覆盖的 UITypeEditor.GetEditStyle 方法中,我验证源 Enum 是否设置了 FlagsAttribute
。如果枚举类型有这个属性 class,那么我 return UITypeEditorEditStyle.DropDown
显示我的自定义 CheckedListBox
。如果没有,我 return UITypeEditorEditStyle.Modal
和 .NET Framework 使用默认编辑器编辑枚举,使用默认 ComboBox
显示和 select 枚举 values/names.
问题是,.NET framework class 库中的默认内置编辑器用于编辑普通枚举,我注意到它会搜索值为 0 的枚举名称以将其显示为默认值,如果它没有找到它,抛出一个 System.ArgumentException
并且不显示默认值。
以这个枚举为例:
public enum TestEnum {
a = 1,
b = 2,
c = 4
}
这将在 属性 网格的编辑器中抛出一个 System.ArgumentException
并且不会显示默认值,因为 Enum 的默认 .NET Framework 编辑器期望 Enum 中的值为 0 ...
现在,使用 System.DayOfWeek 枚举来查看差异:
DayOfWeek.Sunday
(0) 默认为 select,因此会抛出任何异常。
然后,在我的 EnumFlagsEditor
class 中,我想阻止这种行为。我希望编辑器在 属性 网格中为我的编辑器显示一个默认值。我不关心异常,但我想显示一个特定的初始值...更准确地说,是源枚举中定义的最小值。
我该怎么做?
这不是 UITypeEditor 问题,而是 TypeConverter issue. What you can do is derive from the standard EnumConverter class,像这样:
[TypeConverter(typeof(MyEnumConverter))]
public enum TestEnum
{
a = 1,
b = 2,
c = 4
}
public class MyEnumConverter : EnumConverter
{
public MyEnumConverter(Type type)
: base(type)
{
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
try
{
return base.ConvertTo(context, culture, value, destinationType);
}
catch
{
if (destinationType == typeof(string))
{
// or whatever you see fit
return "a";
}
throw;
}
}
}
PS:你可以避免异常捕获并进行自己的转换,但它可能比一般情况下看起来更难(取决于枚举底层类型等)。