Общие сведения о поставщике расширителей
Поставщик расширителей — это компонент, предоставляющий свойства другим компонентам. Например, когда на форму добавляется компонент ToolTip, он предоставляет всем элементам управления на этой форме свойство ToolTip. После этого свойство ToolTip появляется во всех элементах управления PropertyGrid, которым оно было назначено. Во время разработки можно задать значение этого свойства.
На самом деле свойство, предоставляемое поставщиком расширителей, находится в самом объекте поставщика расширителей и поэтому не является истинным свойством изменяемого компонента. Во время разработки это свойство появляется в любом элементе управления PropertyGrid, назначенном изменяемому компоненту. Однако во время выполнения посредством самого компонента к свойству обратиться нельзя. Вместо этого вызывается метод GetToolTip для компонента ToolTip.
Реализация
В следующем списке описываются шаги, необходимые для реализации поставщика расширителей:
Для задания свойства, предоставленного поставщиком расширителей, используйте атрибут ProvidePropertyAttribute.
Реализуйте предоставленное свойство.
Отследите, какой элемент управления получил предоставленное свойство.
Реализуйте интерфейс IExtenderProvider.
Дополнительные сведения см. в разделе Практическое руководство. Реализация поставщика расширения. Полный пример см. в разделе Практическое руководство. Реализация поставщика расширителей HelpLabel.
Атрибут ProvideProperty
Поскольку поставщик расширителей является классом, он имеет собственные свойства и методы. Чтобы указать, что некоторое свойство должно предоставляться другим компонентам, необходимо на уровне класса применить атрибут ProvidePropertyAttribute. Этот атрибут задает имя предоставляемого свойства и тип объекта, для которого это свойство может быть предоставлено.
Реализация предоставленного свойства
Используется соглашение, по которому предоставляемое свойство реализуется не как свойство, а как пара методов. Эти методы должны называться GetИмяСвойства и SetИмяСвойства. Например, если реализация поставщика расширителей предоставляет свойство DemoText, методы нужно назвать GetDemoText и SetDemoText.
Эти методы принимают всего один параметр Component, что позволяет отслеживать назначение значений свойства компонентам.
Отслеживание элементов управления, получающих предоставленное свойство
Реализация предоставляемого свойства требует наличия объекта IDictionary или аналогичного объекта коллекции для записи и извлечения значений свойств каждого компонента.
Например, можно использовать экземпляр компонента как свойство Key для DictionaryEntry и значение свойства как свойство Value для DictionaryEntry. При вызове метода GetИмяСвойства реализация запрашивает у коллекции значение свойства, соответствующее данному компоненту.
Реализация интерфейса IExtenderProvider
Каждый класс расширителя должен реализовывать интерфейс IExtenderProvider. Этот интерфейс состоит из единственного метода CanExtend, возвращающего логическое значение и показывающего конструктору, может ли компонент быть расширен.
Несмотря на то, что поставщик расширений может предоставлять свойства любым компонентам, его реализация обычно включает действия, делающие возможным использование свойства лишь особой категорией компонентов. Например, может понадобиться создать расширитель, который будет предоставлять свойство только для элементов управления. Реализация метода CanExtend может вызывать это ограничение.
См. также
Задачи
Практическое руководство. Реализация поставщика расширения
Практическое руководство. Реализация поставщика расширителей HelpLabel