UITypeEditor и IExtenderProvider

У меня есть расширитель (IExtenderProvider), который расширяет определенные типы элементов управления дополнительными свойствами. Для одного из этих свойств я написал UITypeEditor. Пока все работает нормально.

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

Простой пример: ExtenderProvider имеет свойство DefaultExtendedValue. В форме я установил для этого свойства значение «Мое значение». Расширенные элементы управления имеют через поставщика свойство ExtendedValue с UITypeEditor. Когда я открываю редактор для свойства ExtendedValue, значение по умолчанию (начальное) должно быть установлено на «Мое значение».

Мне кажется, что лучшим местом для этого будет UITypeEditor.EditValue, непосредственно перед вызовом IWindowsFormsEditorService.DropDownControl или .ShowDialog.

Единственная проблема заключается в том, что я не могу (или не обнаружил, как это сделать) получить сам поставщик расширителей в EditValue, чтобы прочитать значение рассматриваемого свойства и установить его в UITypeEditor. Контекст дает мне расширенный контроль, но в данном случае это бесполезно.

Есть ли способ добиться того, что я пытаюсь? Любая помощь приветствуется!

Спасибо Том


@samjudson: Это неплохая идея, но, к сожалению, до меня не доходит. Я бы очень хотел иметь возможность устанавливать это значение по умолчанию индивидуально для каждого экземпляра провайдера расширителя. (У меня может быть несколько в одной форме с разными значениями для разных групп расширенных элементов управления.)


person Tom Juergens    schedule 25.08.2008    source источник


Ответы (3)


Не могли бы вы сами прочитать атрибут?

DefaultValueAttribute att = context.
    PropertyDescriptor.Attributes.
    OfType<DefaultValueAttribute>().
    FirstOrDefault();
object myDefault = null;
if ( att != null )
    myDefault = att.Value;

Я использовал Linq для упрощения кода, но вы могли бы сделать что-то подобное в .Net 1.

person Keith    schedule 09.10.2008

Привет, я нашел это: http://social.msdn.microsoft.com/forums/en-US/winformsdesigner/thread/07299eb0-3e21-42a3-b36b-12e37282af83/

В основном :

var Ctl = context.Instance as Control;

Type t = Type.GetType("System.ComponentModel.ExtendedPropertyDescriptor");
LocalizationProvider myProvider = GetValueOnPrivateMember(t, context.PropertyDescriptor, "provider") as MyOwnExtenderProvider;

И волшебным образом myProvider получил мой элемент управления IExtenderProvider!

где GetValueOnPrivateMember должен быть реализован следующим образом:

static object GetValueOnPrivateMember(Type type, object dataobject, string fieldname)
        {
            BindingFlags getFieldBindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField;
            return type.InvokeMember(fieldname,
                getFieldBindingFlags,
                null,
                dataobject,
                null);
        }
person Larry    schedule 03.02.2010

Рассматривали ли вы добавление DefaultValue в качестве статического свойства ExtenderProvider, чтобы вы могли получить к нему доступ, не требуя экземпляра поставщика?

person samjudson    schedule 27.08.2008