Надо в рантайме задать значения атрибутам(+)
От: Dimonira  
Дата: 23.11.10 11:12
Оценка:
DisplayName, Description, Browsable некоторых свойств в момент инициализации класса конфигурации, который сериализуется из xml-файла (из него читается некий массив) или создаётся при его отсутствии (тогда оператору вопрос о величине массива). Дальше атрибуты изменяться не должны (хотя это, как я понимаю, уже не важно). Зависимость от величины массива: если один элемент в массиве, то одни значения у DisplayName и Description свойств и Browsable = false у свойства, а если два (или более) элементов в массиве, то соответственно другие значения DisplayName и Description и Browsable = true. Конфигурация свойств класса показывается и редактируется через PropertyGrid.
Re: Надо в рантайме задать значения атрибутам(+)
От: Sinix  
Дата: 23.11.10 11:52
Оценка:
Здравствуйте, Dimonira, Вы писали:

Копать в сторону CustomTypeDescriptor
http://www.propertygridresourcelist.com/
http://msdn.microsoft.com/en-us/magazine/cc163816.aspx
http://www.codeproject.com/KB/tabs/customizingcollectiondata.aspx
Re: Надо в рантайме задать значения атрибутам(+)
От: RushDevion Россия  
Дата: 23.11.10 11:54
Оценка:
Первое, что пришло в голову:
Нужно создать свой TypeDescriptor для вашего класса конфигурации,
который будет возвращать различные значения PropertyDescriptor в зависмости от тех или иных условий.
Гуглите на тему ICustomTypeDescriptor для ProperyGrid.

Вот и вот пара ссылок.
Re[2]: Надо в рантайме задать значения атрибутам(+)
От: Dimonira  
Дата: 23.11.10 12:35
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Копать в сторону CustomTypeDescriptor

S>http://www.propertygridresourcelist.com/
S>http://msdn.microsoft.com/en-us/magazine/cc163816.aspx
S>http://www.codeproject.com/KB/tabs/customizingcollectiondata.aspx

Не силён я пока в ентом деле Как я понял, эти способы реализуют некую "обёртку" над требуемым классом (в моём случае классом конфигурации), в которой нужные атрибуты добавлены или изменены. И эта обёртка потом подсовывается в PropertyGrid. Это бы и хорошо, но мне то надо потом, когда значения свойств будут изменены оператором, получить для последующего сохранения конфигурацию, т.е. исходный объект, а не "обёрнутый". Как с этим быть?
Или я что-то не понял...
Re[2]: Надо в рантайме задать значения атрибутам(+)
От: Dimonira  
Дата: 23.11.10 12:38
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Первое, что пришло в голову:

RD>Нужно создать свой TypeDescriptor для вашего класса конфигурации,
RD>который будет возвращать различные значения PropertyDescriptor в зависмости от тех или иных условий.
RD>Гуглите на тему ICustomTypeDescriptor для ProperyGrid.

RD>Вот и вот пара ссылок.


Ответил чуть выше, в предыдущей ветке.
Re[3]: Надо в рантайме задать значения атрибутам(+)
От: Sinix  
Дата: 23.11.10 12:52
Оценка:
Здравствуйте, Dimonira, Вы писали:

D>Не силён я пока в ентом деле Как я понял, эти способы реализуют некую "обёртку" над требуемым классом (в моём случае классом конфигурации), в которой нужные атрибуты добавлены или изменены. И эта обёртка потом подсовывается в PropertyGrid. Это бы и хорошо, но мне то надо потом, когда значения свойств будут изменены оператором, получить для последующего сохранения конфигурацию, т.е. исходный объект, а не "обёрнутый". Как с этим быть?

D>Или я что-то не понял...

Меня щас тут поправят — я очень давно возился с PropertyGrid, но основная идея следующая: PropertyGrid работает с PropertyDescriptorCollection. Реализовав свой custom type descriptor, вы можете просто вернуть оригинальную коллекцию (убрав из коллекции лишние свойства), или реализовать свои PropertyDescriptor'ы. В любом случае, изменения будут производиться в оригинальном объекте (если вы не сделаете иначе в своём property descriptor'е).
Re[4]: Надо в рантайме задать значения атрибутам(+)
От: Dimonira  
Дата: 23.11.10 14:00
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Меня щас тут поправят — я очень давно возился с PropertyGrid, но основная идея следующая: PropertyGrid работает с PropertyDescriptorCollection. Реализовав свой custom type descriptor, вы можете просто вернуть оригинальную коллекцию (убрав из коллекции лишние свойства), или реализовать свои PropertyDescriptor'ы. В любом случае, изменения будут производиться в оригинальном объекте (если вы не сделаете иначе в своём property descriptor'е).


Нарыл для BrowsableAttribute, вроде работает (этот кусок кода выполняется при инициализации если надо установить в false, изначально атрибут установлен в true):

PropertyDescriptor descriptor = TypeDescriptor.GetProperties(_instance.GetType())["SomeProperty"];
BrowsableAttribute attrib = (BrowsableAttribute)descriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo isBrowsable = attrib.GetType().GetField("browsable", BindingFlags.NonPublic | BindingFlags.Instance);
isBrowsable.SetValue(attrib, false);


Но по аналогии с этим, для DisplayName, Description не прокатывает: переменная типа FieldInfo равна null. Не пойму в чём тут дело...
Re[5]: Надо в рантайме задать значения атрибутам(+)
От: Sinix  
Дата: 23.11.10 14:39
Оценка: +1
Здравствуйте, Dimonira, Вы писали:

D>Нарыл для BrowsableAttribute, вроде работает (этот кусок кода выполняется при инициализации если надо установить в false, изначально атрибут установлен в true):


Это хак, в теории он и не должен работать (а в будущем может и перестать работать). Надо копать именно в сторону custom type descriptor
Re[5]: Надо в рантайме задать значения атрибутам(+)
От: _FRED_ Черногория
Дата: 23.11.10 15:53
Оценка:
Здравствуйте, Dimonira, Вы писали:

D>Нарыл для BrowsableAttribute


Возьмите правильную лопату. Той, что используете вы, больше шышек набьёте, чем "нароете"

Набросок "правильной" лопаты можно посмотреть здесь
Автор: _FRED_
Дата: 28.03.07
.

D>PropertyDescriptor descriptor = TypeDescriptor.GetProperties(_instance.GetType())["SomeProperty"];


".GetType()" совершенно вреден: имея экземпляр объекта, свойства и прочую ComponentModel надо вытягивать через него. Перегрузки с Type для случаев, когда экземпляра нет.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.