E' un po' che uso questa strategia, soprattutto perchè mi piace il componente propertygrid, che permette di editare le proprietà pubbliche di un oggetto. Se una delle proprietà è un enum, viene graziosamente presentato un combobox per scegliere il valore possibile. Tuttavia le scritte presentate sono i nomi interni dell'enum, che possono essere un po' criptici per l'utente finale, e peggio a volte devono essere tradotti. Visto che non si può derivare una classe da un enum per fare l'override di ToString(), una ( possibile ) soluzione è quella di utilizzare un TypeConverter
xes:
[TypeConverter(typeof(SheetForecastingEnumConverter))]
public enum SheetForecastingEnum
{
None,
Auto,
UserSelection
}
quindi si implementa la classe del converter:
class SheetForecastingEnumConverter : TypeConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
if (value is string)
{
switch (value)
{
case "None":
return SheetForecastingEnum.None;
........ // altri case per i vari valori
}
}
return base.ConvertFrom(context, culture, value);
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
//show combobox
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
//show non editable combobox
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection
(
new SheetForecastingEnum[] { SheetForecastingEnum.Auto, SheetForecastingEnum.None, SheetForecastingEnum.UserSelection }
);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string) && value != null)
{
SheetForecastingEnum ct = (SheetForecastingEnum)value;
switch (ct)
{
case SheetForecastingEnum.None:
return "Nessuno";
......
default:
return "?";
}
}
else
return base.ConvertTo(context, culture, value, destinationType);
}
}
ed il gioco è fatto.