Я пытаюсь использовать ExpandoObject в качестве SelectedObject PropertyGrid. Я знаю, как добавить свойства, которые я хочу в 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;
}
Этот код работает нормально - отладчик показывает имена и значения свойств expando
, как и ожидалось.
Однако ни одно из сгенерированные свойства отображаются в PropertyGrid, когда я устанавливаю возвращаемое значение MakePropertyObject ()
для его свойства SelectedObject
. Я предполагаю (возможно, ошибочно), что это связано с тем, что свойства ExpandoObject
не имеют атрибутов DisplayNameAttribute
, DescriptionAttribute
или каких-либо других атрибутов, используемых для контролировать способ отображения свойств в PropertyGrid
.
I ' Я прочитал и погуглил, и я не могу понять, есть ли способ украсить сгенерированные свойства ExpandoObject
настраиваемыми атрибутами. Кто-нибудь знает, как это можно сделать, или как лучше показать ExpandoObject
в PropertyGrid
?
РЕШЕНИЕ:
Ответ, предоставленный @Stephen Cleary, был правильно и полезно (спасибо, Стивен). Для других с той же проблемой реализация ICustomTypeDescriptor
отлично сработала для меня.
В качестве примечания: объект, реализующий ICustomTypeDescriptor
, предоставляет дескрипторы свойств и событий для себя , а не для другого объекта . Я думал, что дескриптор и описываемое должны быть связаны атрибутом или чем-то вначале - мне казалось сбивающим с толку и избыточным, что объект должен описывать свой собственный тип, но именно так PropertyGrid
s используют Интерфейс ICustomTypeDescriptor
.