Главная » C#, Компоненты » Реализация собственного конвертера типа

0

Класс Gradientconverter, являющийся реализацией конвертера типа для GradientParameters, показан В листинге 8.6.

Теперь остается только привязать его к нашему свойству, для того чтобы редактор свойств знал, что для данного свойства используется созданный нами конвертер типа. Для привязки конвертера типа к свойству нужно задать атрибут TypeConverter. Сделать привязку можно для конкретного свойства:

[TypeConverter(typeof(Gradientconverter))] public GradientParameters Gradient

{

get { return gradient; } set { gradient = value; }

Или МОЖНО привязать конвертер типа К классу GradientParameters:

[TypeConverter(typeof(GradientConverter))3 public class GradientParameters

В этом случае он будет использоваться во всех экземплярах этого класса. Результат работы конвертера типа показан на рис. 8.4. Все выглядит хорошо, если бы не одна проблема. Фактически мы преобразовали класс GradientParameters в строку, и, соответственно, все свойства, составляющие . этот класс, стали не видны.

Рис. 8.4. Отображение свойства GradientParameters в виде строки в редакторе свойств

^Листинг 8 6. Класс конвертера типа Зт-.зрп-^лглгк^го

using System;

using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Globalization; using System. Drawing;

namespace MyControl

{

// Этот класс разрешает отображать тип GradientParameters //в строку, что позволяет показывать его в диалоге свойств, class GradientConverter : TypeConverter (

// Перекрываем метод CanConvertFrom.

// Интерфейс ITypeDescriptorContext передает контекст преобразования, public override bool CanConvertFrom(

ITypeDescriptorContext context, Type sourceType)

{

// Разрешаем преобразовывать string

if (sourceType == typeof(string)) {

return true;

}

// Вызываем базовый метод

return base.CanConvertFromfcontext, sourceType);

}

// Перекрываем метод ConvertFrom. Производим преобразование

// в пользовательский тип.

public override object ConvertFrom{

ITypeDescriptorContext context, Culturelnfo culture, object value)

{

// Преобразовываем строку в GradientParameters

if {value is string) {

return GradientParameters.Parse{value as string);

}

return base.ConvertFrom(context, culture, value);

}

// Перекрываем метод ConvertTo. Производим преобразование // из пользовательского типа, public override object ConvertTo{

ITypeDescriptorContext context, Culturelnfo culture, object value, Type destinationType)

{

// Преобразовываем GradientParameters в строку

if (destinationType == typeof(string)) {

if (value != null) {

if (value is GradientParameters)

return {{GradientParameters) value) .ToStringO ; else

return value;

}

)

return base.ConvertTo(context, culture, value, destinationType);

}

}

}

Для того чтобы напомнить редактору свойств, что наш класс имеет два свойства, нужно перекрыть еще два метода базового класса TypeConverter: О метод bool GetPropertiesSupported(ITypeDescriptorContext context) Должен возвращать true, если объект, полученный после работы конвертера типа, имеет свойства, которые должен обрабатывать редактор свойств;

О метод propertyDescriptorCollection GetProperties (ITypeDescriptorContext context, object value, Attribute [] attributes) ВОЗВращает коллекцию описаний свойств, которые нужно отображать в редакторе свойств. В нашем случае создавать свои дескрипторы необходимости нет, вполне достаточно вызвать метод GetPropertiesо класса TypeDescriptor, ВОЗВра- щающий нужную нам коллекцию. Параметр attributes задает фильтр свойств, которые просит редактор свойств (о фильтре см. разд. 8.8). Получившийся класс приведен в листинге 8.7, а рис. 8.5 показывает, что теперь наш класс не только представлен строкой, но и имеет два свойства.

Для полноты картины замечу, что можно перекрыть еще метод bool CanConvertTo (ITypeDescriptorContext context, Type destinationType), возвращающий true, если значение нашего класса можно преобразовать к типу destinationType. Правда, по умолчанию этот метод всегда возвращает true, если destinationType является ТИПОМ String.

^Листинг 8 7 Класс конвертера типа foadiei.t EurcimdLwrs с двумя своинвами

using System?

using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.Globalization; using System. Drawing;

namespace MyControl

}

// Этот класс позволяет отображать тип GradientParameters // в строку.

class Gradientconverter : TypeConverter

{

11 Возвращает true, если нужно отображать свойства класса public override bool GetPropertiesSupported(

ITypeDescriptorContext context)

{

return true;

}

// Возвращает коллекцию свойств, которые нужно отображать public override PropertyDescriptorCollection GetProperties ( ITypeDescriptorContext context, object value, Attribute[] attributes)

{

return TypeDescriptor.GetProperties(

typeof(GradientParameters));

}

}

}

Рис. 8.5. Свойство GradientParameters состоит из двух полей

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии