Как сделать составной компонент пригодным для использования с дизайнером?

Я экспериментирую с написанием собственных компонентов WinForms и написал пару простых компонентов валидатора для использования с подклассом ErrorProvider , который автоматически перехватывает события валидации. Все эти компоненты могут быть добавлены в форму и подключены с использованием только дизайнера благодаря IExtenderProvider .

Теперь, пытаясь подняться на один уровень выше, я пытаюсь заставить составной валидатор можно использовать с дизайнером. Я могу запустить его и работать с кодом, но это действительно просто. Я бы хотел, чтобы это работало только для дизайнера.

Моя трудность заключается в раскрытии свойства, которое представляет собой набор других валидаторов, находящихся в той же форме. Все валидаторы наследуются напрямую от Component и реализуют интерфейс IControlValidator . Я готов изменить это, чтобы они унаследовали от базового класса ValidatorComponent , если это поможет.

Я подумал о нескольких решениях, но либо они мне не нравятся, либо я не могу заставить их работать:

  1. Сделайте валидаторы невидимыми элементами управления, а составной валидатор содержит их, аналогично тому, что делает Panel ;

    Этот мне не нравится, потому что он больше о взломе, и необходимость жонглировать ими среди настоящих элементов управления просто кажется неправильным;

  2. Используйте редактор коллекций, как вы используете для панелей инструментов;

    Я поискал в Интернете и нашел пару статей об этом, но не смог заставить их работать. По крайней мере, без создания собственной формы редактора, что было бы слишком хлопотно для экспериментального проекта.

    Признаюсь, я не тратил много времени на это, потому что понял, используя стандартный CollectionEditor привел бы меня к использованию фиксированного набора типов валидаторов (не так ли?).

    Я также подумал о создании простого класса ValidatorReference с единственным свойством типа IControlValidator и используйте его как тип элемента для простого редактора коллекций. Затем я бы добавил один из них и в его сетке свойств установил свойство для существующего компонента валидатора. Это кажется легким в использовании, но теряет свою привлекательность, потому что это такой очевидный взлом.

У кого-нибудь есть другие идеи? Что-то мне не хватает, а это что-то простое?

14
задан R. Martinho Fernandes 12 April 2011 в 23:41
поделиться