DisplayName, Description, Browsable некоторых свойств в момент инициализации класса конфигурации, который сериализуется из xml-файла (из него читается некий массив) или создаётся при его отсутствии (тогда оператору вопрос о величине массива). Дальше атрибуты изменяться не должны (хотя это, как я понимаю, уже не важно). Зависимость от величины массива: если один элемент в массиве, то одни значения у DisplayName и Description свойств и Browsable = false у свойства, а если два (или более) элементов в массиве, то соответственно другие значения DisplayName и Description и Browsable = true. Конфигурация свойств класса показывается и редактируется через PropertyGrid.
Первое, что пришло в голову:
Нужно создать свой TypeDescriptor для вашего класса конфигурации,
который будет возвращать различные значения PropertyDescriptor в зависмости от тех или иных условий.
Гуглите на тему ICustomTypeDescriptor для ProperyGrid.
Не силён я пока в ентом деле Как я понял, эти способы реализуют некую "обёртку" над требуемым классом (в моём случае классом конфигурации), в которой нужные атрибуты добавлены или изменены. И эта обёртка потом подсовывается в PropertyGrid. Это бы и хорошо, но мне то надо потом, когда значения свойств будут изменены оператором, получить для последующего сохранения конфигурацию, т.е. исходный объект, а не "обёрнутый". Как с этим быть?
Или я что-то не понял...
Re[2]: Надо в рантайме задать значения атрибутам(+)
Здравствуйте, RushDevion, Вы писали:
RD>Первое, что пришло в голову: RD>Нужно создать свой TypeDescriptor для вашего класса конфигурации, RD>который будет возвращать различные значения PropertyDescriptor в зависмости от тех или иных условий. RD>Гуглите на тему ICustomTypeDescriptor для ProperyGrid.
RD>Вот и вот пара ссылок.
Ответил чуть выше, в предыдущей ветке.
Re[3]: Надо в рантайме задать значения атрибутам(+)
Здравствуйте, Dimonira, Вы писали:
D>Не силён я пока в ентом деле Как я понял, эти способы реализуют некую "обёртку" над требуемым классом (в моём случае классом конфигурации), в которой нужные атрибуты добавлены или изменены. И эта обёртка потом подсовывается в PropertyGrid. Это бы и хорошо, но мне то надо потом, когда значения свойств будут изменены оператором, получить для последующего сохранения конфигурацию, т.е. исходный объект, а не "обёрнутый". Как с этим быть? D>Или я что-то не понял...
Меня щас тут поправят — я очень давно возился с PropertyGrid, но основная идея следующая: PropertyGrid работает с PropertyDescriptorCollection. Реализовав свой custom type descriptor, вы можете просто вернуть оригинальную коллекцию (убрав из коллекции лишние свойства), или реализовать свои PropertyDescriptor'ы. В любом случае, изменения будут производиться в оригинальном объекте (если вы не сделаете иначе в своём property descriptor'е).
Re[4]: Надо в рантайме задать значения атрибутам(+)
Здравствуйте, Sinix, Вы писали:
S>Меня щас тут поправят — я очень давно возился с PropertyGrid, но основная идея следующая: PropertyGrid работает с PropertyDescriptorCollection. Реализовав свой custom type descriptor, вы можете просто вернуть оригинальную коллекцию (убрав из коллекции лишние свойства), или реализовать свои PropertyDescriptor'ы. В любом случае, изменения будут производиться в оригинальном объекте (если вы не сделаете иначе в своём property descriptor'е).
Нарыл для BrowsableAttribute, вроде работает (этот кусок кода выполняется при инициализации если надо установить в false, изначально атрибут установлен в true):
Здравствуйте, Dimonira, Вы писали:
D>Нарыл для BrowsableAttribute, вроде работает (этот кусок кода выполняется при инициализации если надо установить в false, изначально атрибут установлен в true):
Это хак, в теории он и не должен работать (а в будущем может и перестать работать). Надо копать именно в сторону custom type descriptor
Re[5]: Надо в рантайме задать значения атрибутам(+)
".GetType()" совершенно вреден: имея экземпляр объекта, свойства и прочую ComponentModel надо вытягивать через него. Перегрузки с Type для случаев, когда экземпляра нет.
Help will always be given at Hogwarts to those who ask for it.