To reproduce:
Set the following object as selected of RadPropertyGrid:
class TestClass : System.ComponentModel.INotifyPropertyChanged
{
private string loggingType = "0";
[TypeConverter(typeof(CustomListConverter)), CategoryAttribute("Logging Settings")]
public string LoggingType
{
get { return loggingType; }
set
{
loggingType = value;
OnPropertyChanged("LoggingType");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
And use the following converter:
public class CustomListConverter : System.ComponentModel.StringConverter
{
ArrayList _AllStringValues = new ArrayList();
Hashtable _Map = new Hashtable();
public CustomListConverter()
{
}
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext conte
{
FillValuesFromContext();
StandardValuesCollection standardValues = new StandardValuesCollection(_AllStringValues);
return standardValues;
}
private void FillValuesFromContext()
{
if (_AllStringValues.Count > 0)
return;
_AllStringValues.Clear();
_Map.Clear();
string str = "-5,Fatal|-4,Error|-3,Warning|-2, Info|-1,Debug|0,Trace";
string[] strMapVals = str.Split('|');
for (int i = 0; i < strMapVals.Length; i++)
{
string[] strVals = strMapVals[i].Split(',');
if (strVals.Length != 2)
continue;
_AllStringValues.Add(strVals[0].Trim());
_Map.Add(strVals[0].Trim(), strVals[1].Trim());
}
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
FillValuesFromContext();
string displayString = "";
IEnumerator enumTable = _Map.Keys.GetEnumerator();
while (enumTable.MoveNext())
{
if (_Map[enumTable.Current] as string == value as string)
{
displayString = enumTable.Current as string;
break;
}
}
return displayString;
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
FillValuesFromContext();
if (null != value && _Map.ContainsKey(value.ToString()))
{
return _Map[value];
}
return value;
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
}
When you start the application you will see that the value of the property is set to -1, while it should be converted to 'Debug'
Workaround:
Create a custom PropertyGridItem:
public class MyPropertyGridItem : PropertyGridItem
{
public MyPropertyGridItem(PropertyGridTableElement element)
: base(element)
{
}
public override string FormattedValue
{
get
{
string baseFormattedValue = base.FormattedValue;
TypeConverter converter = TypeConverter;
if (converter != null && converter.CanConvertTo(this, typeof(string)))
{
baseFormattedValue = converter.ConvertToString(this, System.Threading.Thread.CurrentThread.CurrentCulture, this.Value);
}
return baseFormattedValue;
}
set
{
base.FormattedValue = value;
}
}
}
Use it by subscribing to the CreateItem event:
void radPropertyGrid1_CreateItem(object sender, Telerik.WinControls.UI.CreatePropertyGridItemEventArgs e)
{
e.Item = new MyPropertyGridItem(this.radPropertyGrid1.PropertyGridElement.PropertyTableElement);
}