I'm writing a GUI application where I need to enable editing properties of arbitrary objects (their types are only known at run-time).
I've decided to use the PropertyGrid control to enable this functionality. I created the following class:
[TypeConverter(typeof(ExpandableObjectConverter))]
[DefaultPropertyAttribute("Value")]
public class Wrapper
{
public Wrapper(object val)
{
m_Value = val;
}
private object m_Value;
[NotifyParentPropertyAttribute(true)]
[TypeConverter(typeof(ExpandableObjectConverter))]
public object Value
{
get { return m_Value; }
set { m_Value = value; }
}
}
When I get an instance of an object I need to edit, I create a Wrapper for it and set it as the selected object:
Wrapper wrap = new Wrapper(obj);
propertyGrid.SelectedObject = wrap;
But I've run into the following problem - the above works as expected only when the type of obj is some custom type (i.e a class that I defined by myself, or a built in complex type) but not when obj is a primitive.
For example, if I define:
[TypeConverter(typeof(ExpandableObjectConverter))]
public class SomeClass
{
public SomeClass()
{
a = 1;
b = 2;
}
public SomeClass(int a, int b)
{
this.a = a;
this.b = b;
}
private int a;
[NotifyParentPropertyAttribute(true)]
public int A
{
get { return a; }
set { a = value; }
}
private int b;
[NotifyParentPropertyAttribute(true)]
public int B
{
get { return b; }
set { b = value; }
}
}
And do:
Wrapper wrap = new Wrapper(new SomeClass());
propertyGrid.SelectedObject = wrap;
Then everything works swell. On the other hand, when I perform the following:
int num = 1;
Wrapper wrap = new Wrapper(num);
propertyGrid.SelectedObject = wrap;
Then I can see the value "1" in the grid (and it's not grayscaled) but I can't edit the value. I noticed that if I change Wrapper's "Value" property's type to int and remove the TypeConverter attribute, it works. I get the same behavior for other primitive types and strings.
What is the problem?
Thanks in advance!
parentConverter.GetProperties(context.Instance);
return null? – Circum