UITypeEditor и IExtenderProvider
У меня есть расширитель (IExtenderProvider), который расширяет определенные типы элементов управления с дополнительными свойствами. Для одного из этих свойств я написал UITypeEditor. Пока что все работает просто отлично.
У расширителя также есть пара свойств, которые я пытаюсь использовать как тип по умолчанию для UITypeEditor. То, что я хочу сделать, это иметь возможность установить свойство для самого экстендера (не для расширенных элементов управления), и когда я открываю UITypeEditor для одного из дополнительных свойств в расширенном элементе управления, я хочу установить значение в UITypeEditor для значения свойства на расширителе.
Простой пример: ExtenderProvider имеет свойство DefaultExtendedValue. В форме я установил значение этого свойства в "My Value". Расширенные элементы управления через поставщика имеют свойство ExtendedValue с UITypeEditor. Когда я открываю редактор для свойства ExtendedValue, значение по умолчанию (начальное) должно быть установлено на "My Value".
Мне кажется, что лучшее место для этого было бы UITypeEditor.EditValue, непосредственно перед вызовом IWindowsFormsEditorService.DropDownControl или.ShowDialog.
Единственная проблема заключается в том, что я не могу (или я не обнаружил, как это сделать) заполучить самого провайдера расширителя в EditValue, чтобы прочитать значение рассматриваемого свойства и установить его в UITypeEditor. Контекст дает мне расширенный контроль, но это бесполезно для меня в этом случае.
Есть ли способ добиться того, что я пытаюсь? Любая помощь приветствуется!
Спасибо том
@ samjudson: Это неплохая идея, но, к сожалению, меня это не совсем устраивает. Я действительно хотел бы иметь возможность установить это значение по умолчанию индивидуально для каждого экземпляра поставщика расширителя. (У меня может быть более одного в одной форме с разными значениями для разных групп расширенных элементов управления.)
3 ответа
Не могли бы вы прочитать атрибут самостоятельно?
DefaultValueAttribute att = context.
PropertyDescriptor.Attributes.
OfType<DefaultValueAttribute>().
FirstOrDefault();
object myDefault = null;
if ( att != null )
myDefault = att.Value;
Я использовал Linq для упрощения кода, но вы могли бы сделать что-то подобное еще в.Net 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);
}
Рассматривали ли вы добавление DefaultValue в качестве статического свойства ExtenderProvider, тогда вы можете получить к нему доступ, не требуя экземпляра поставщика?