Please run the attached sample project and refer to the attached screenshots. RadPropertyGrid doesn't respect the Description attribute.
this.radPropertyGrid1.SelectedObject = new Item(123,"Item", ExposureMode.FullAuto);
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public ExposureMode Mode { get; set; }
public Item(int id, string name, ExposureMode mode)
{
this.Id = id;
this.Name = name;
this.Mode = mode;
}
}
public enum ExposureMode
{
[Description("Full Auto")]
FullAuto,
[Description("Auto Filter, Fixed Exposure")]
AutoFilFixedExp,
[Description("Fixed Filter, Auto Exposure")]
FixedFilAutoExp,
[Description("Fixed Filter, Fixed Exposure")]
FullFixed
}
To change the string representation of a value inside RadPropertyGrid one should use a TypeConverter. This converter provides a way for a value of a property to be represented as a string and a string value (user input) to be converted to a property value of the desired type. Here is a generic EnumTypeConverter that will work with any Enum that has its values decorated with a Description attribute:
public class EnumDescriptionTypeConverter<T> : EnumConverter
{
private Dictionary<string, T> lookupDescription;
private Dictionary<T, string> lookupValue;
public EnumDescriptionTypeConverter(Type type)
: base(type)
{
this.lookupDescription = new Dictionary<string, T>();
this.lookupValue = new Dictionary<T, string>();
string[] names = Enum.GetNames(type);
foreach (string name in names)
{
if (!string.IsNullOrEmpty(name))
{
FieldInfo field = type.GetField(name);
if (field != null)
{
DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attr != null)
{
T value = (T)Enum.Parse(type, name);
this.lookupDescription[attr.Description] = value;
this.lookupValue[value] = attr.Description;
}
}
}
}
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
T mode = (T)value;
if (this.lookupValue.ContainsKey(mode))
{
return this.lookupValue[mode];
}
}
return base.ConvertTo(context, culture, value, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string description = value as string;
if (description != null)
{
return this.lookupDescription[description];
}
return base.ConvertFrom(context, culture, value);
}
}
To use this converter decorate your enum with it and decorate its values with the Description attribute:
[TypeConverter(typeof(EnumDescriptionTypeConverter<ExposureMode>))]
public enum ExposureMode
{
[Description("Full Auto")]
FullAuto,
[Description("Auto Filter, Fixed Exposure")]
AutoFilFixedExp,
[Description("Fixed Filter, Auto Exposure")]
FixedFilAutoExp,
[Description("Fixed Filter, Fixed Exposure")]
FullFixed
}