Можно ли использовать PropertyGrid без объекта? - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть приложение, в котором мне нужно отредактировать некоторые данные, и структура PropertyGrid визуально является лучшим кандидатом для моих нужд.Однако PropertyGrid принимает открытые свойства объекта и отображает их в сетке.(дополнительные опции с атрибутами).Однако у меня нет такого объекта, потому что список пар ключ-значение, которые мне нужно отредактировать, является динамическим.

Идеальным решением было бы что-то вроде этого:

public class GridParam
{
    // ... several constructors here, one for each type
    // ... or a single one but with generic class, does not matter

    public String Name { get; set; }
    public Object Value { get; set; }
    public Type ItemType { get; set; }
}

GridParam stringParam = new GridParam("Address", "2534 Barkeley Av.");
GridParam numberParam = new GridParam("Year", 2012);

NewKindOfPropertyGrid grid = new NewKindOfPropertyGrid();
grid.AddParam(stringParam);
grid.AddParam(numberParam);

Приведенный выше код генерирует сетку свойств, которая выглядит следующим образом: enter image description here

Возможно ли что-то подобное с PropertyGrid или любым другим существующим элементом управления (который, по крайней мере, похож на PG)? Синтаксис не обязательно должен быть похож на то, что я написал, но он должен быть в состоянии принимать коллекцию таких свойств, которые могут быть динамическими, без определения класса ...

1 Ответ

2 голосов
/ 25 мая 2012

У вас есть два варианта здесь.

Первый (и более простой, IMO) - реализовать ICustomTypeDescriptor интерфейс в классе, который принимает IEnumerable<T> из ваших GridParam экземпляров.

PropertyGrid класс фактически не использует отражение напрямую ;вместо этого он использует TypeDescriptor класс для получения метаданных об экземпляре объекта, который по умолчанию использует отражение.

Однако, если вы реализуете ICustomTypeDescriptor, тогда PropertyGrid получит всю информацию, полученную от TypeDescriptor от вашей реализации.Вы просто должны передать ему то, что хотите показать.

Так что в этом случае у вас будет реализация GetProperties, возвращающая PropertyDescriptorCollectionзаполненный PropertyDescriptor для каждого из ваших GridParam экземпляров.

Другой, гораздо более сложный (возможно) вариант - динамически создавать тип и связывать его с этим.(поскольку PropertyGrid требует object для привязки).Конечно, вы действительно реплицируете на каком-то уровне большую часть того, что сделала бы реализация ICustomTypeDescriptor, поэтому, вероятно, лучше пойти с первым.

...