I'm trying to use an ExpandoObject as the SelectedObject of a PropertyGrid. I know how to add the properties I want to the ExpandoObject:
public dynamic MakePropertyObject()
{
dynamic expando = new ExpandoObject();
var dictionary = expando as IDictionary<string, object>;
foreach(MyClass m in PropertiesINeedToAdd)
dictionary[m.Name] = m.Value;
return expando;
}
This code's working fine- the debugger shows the names and values of expando
's properties as expected.
However, none of the generated properties is showing up in the PropertyGrid when I set the return value of MakePropertyObject()
to its SelectedObject
property. I assume (perhaps falsely) that this is because the ExpandoObject
's properties don't have any DisplayNameAttribute
, DescriptionAttribute
, or any of the other attributes used to control how properties are displayed in a PropertyGrid
.
I've done some reading and some Googling, and I can't figure out if there's a way to decorate the generated properties of an ExpandoObject
with custom attributes. Does anyone know how this can be done, or of a better way to show an ExpandoObject
in a PropertyGrid
?
SOLUTION:
The answer provided by @Stephen Cleary was correct and helpful (thanks, Stephen). For others with the same problem, implementing ICustomTypeDescriptor
worked perfectly for me.
As a side note, the object that implements ICustomTypeDescriptor
provides the property and event descriptors for itself, not for another object. I thought the descriptor and the described were supposed to be linked by an attribute or something at first- it seemed confusing and redundant to me that an object should describe its own type, but that's indeed how PropertyGrid
s use the ICustomTypeDescriptor
interface.