2008-08-25 9 views
2

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

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

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

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

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

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

Благодаря Том


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

ответ

0

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

2

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

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

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

1

Привет Я нашел это: 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); 
     }