C # PropertyGrid => Как изменить видимые свойства во время выполнения - PullRequest
0 голосов
/ 09 сентября 2011

У меня к следующей проблеме,

В редакторе карт вы можете размещать «Соединения» (FarseerPhysics) на объектах, есть 23 типа соединений (в перечислении). Соединения все в значительной степени одинаковы (всего 1-2 новых свойства для каждого типа соединения). Я хочу, чтобы пользователь мог менять соединения с помощью WinForm PropertyGrid. Так что, если пользователь изменяет свойство JointType (перечисление), PropertyGrid необходимо скрыть старые свойства и показать новые, есть ли способ достичь этого? (Все свойства всех соединений сохраняются в ОДНОМ классе, называемом JointItem, мне просто нужно динамически показать / скрыть некоторые из них)

1 Ответ

3 голосов
/ 10 сентября 2011

Нет простой в использовании встроенной поддержки в PropertyGrid для динамического изменения того, какие свойства видны в зависимости от значения другого свойства. Это не значит, что это невозможно, просто нужно немного поработать.

Как вы уже обнаружили, то, что контролирует, является ли свойство видимым или нет, это BrowsableAttribute. Таким образом, в основном вам нужно динамически изменить этот атрибут, и способ сделать это - создать собственные TypeProvider и TypeDescriptor для вашего класса, который динамически возвращает атрибут Browsable(false) или Browsable(true) для свойства, которое будет скрыто / отображается в зависимости от значения другого свойства в классе. Я не буду пытаться описать, как TypeProvider и TypeDescriptor работают здесь, так как это довольно длительный предмет, и в Интернете уже имеется много информации по этому вопросу.

Кроме того, необходимо указать атрибут [RefreshProperties(RefreshProperties.All)] в свойстве, определяющий, должно ли быть видимым другое свойство или нет. Это заставит сетку свойств запрашивать TypeDescriptor для списка свойств при каждом изменении его значения, давая вашему TypeDescriptor возможность вернуть другой набор свойств или другие атрибуты возвращаемых им свойств.

Надеюсь, это, по крайней мере, укажет вам правильное направление. К сожалению, для склеивания этих вещей требуется немало усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...