Re[4]: .Net – классы, компоненты и контролы
От: VIPrules  
Дата: 15.05.09 08:42
Оценка:
А>Так вот ничего не происходит. Полученное значение не записывает в исходный код. В самом поле я его вижу, могу даже поменять и т.д. А как его в исходник загнать?

А>Что я делаю не так?


А>Спасибо.


Народ, разобрался.
Мож кому понадобится.

Был неправильно реализован Conveter

Вместо:

        // Overrides the ConvertTo method of TypeConverter.
        public override object ConvertTo(ITypeDescriptorContext context,
           CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                //Если тип назначения  - строка, то вернем полное имя сборки
                return ((Type)value).AssemblyQualifiedName;
            }
            //Все другие типы пусть конвертирует базовый класс
            return base.ConvertTo(context, culture, value, destinationType);
        }


Нужно было просто написать:

        public override object ConvertTo(ITypeDescriptorContext context,
           CultureInfo culture, object value, Type destinationType)
        {
            //Вернем значение поля, к. редактируем
            return ((UserControl1)value).BindForm;
        }


Т.е. не нужно было передавать право преобразования в базовый класс. А просто вернуть значение свойства.

Так же полностью отказался от использования виртуальных свойств. Дизайнером для класса назначил стандартный. Вот полный заголовок:

    //Теперь первый аттрибут можно и не указывать
    //[Designer(typeof(/*BindFormComponentDesigner*/ControlDesigner)), DesignerCategory("Default")]
    [TypeConverter(typeof(FormTypeConverter))]
    [Serializable]
    public partial class UserControl1 : UserControl
    {...}


А Editor использовал для свойства напрямую:
 [Editor(typeof(BindFormEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public Type BindForm
        { get; set; }


В результате пропала возможность править значение прямо в поле свойства. Но это даже и к лучшему (защита от дурака). А саму строку для извлечения типа формирую в самописной форме, к. вызывается при нажатии кнопки с троеточием.

После этих манипуляций все получилось.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.