У меня есть расширитель (IExtenderProvider), который расширяет определенные типы элементы управления с дополнительными свойствами. Для одного из этих свойств у меня есть написал UITypeEditor. Пока все работает нормально.
У расширителя также есть несколько свойств, которые я пытаюсь использовать как своего рода значение по умолчанию для UITypeEditor. Я хочу быть возможность установить свойство в самом расширителе (не в расширенных элементах управления), и когда я открываю UITypeEditor для одного из дополнительных свойств на расширенный элемент управления, я хочу установить значение в UITypeEditor на значение недвижимости на экстендере.
Простой пример: ExtenderProvider имеет свойство DefaultExtendedValue. В форме я установил для этого свойства значение «Мое значение». Расширенные элементы управления имеют через поставщика свойство ExtendedValue с UITypeEditor. Когда я открываю редактор для свойства ExtendedValue, значение по умолчанию (начальное) должно быть установлено на «Мое значение».
Мне кажется, что лучше всего это сделать UITypeEditor.EditValue, непосредственно перед вызовом IWindowsFormsEditorService.DropDownControl или .ShowDialog.
Единственная проблема в том, что я не могу (или не знаю, как) удержаться самого поставщика расширителей в EditValue, чтобы прочитать значение рассматриваемого свойства и установить его в UITypeEditor. Контекст дает мне расширенный контроль, но в данном случае это бесполезно.
Есть ли способ добиться того, что я пытаюсь? Любая помощь приветствуется!
Спасибо Том
@samjudson: Это неплохая идея, но, к сожалению, это не совсем меня. Я бы очень хотел иметь возможность устанавливать это значение по умолчанию индивидуально для каждого экземпляра провайдера расширителя. (У меня может быть несколько в одной форме с разными значениями для разных групп расширенных элементов управления.)





Рассматривали ли вы добавление DefaultValue в качестве статического свойства ExtenderProvider, чтобы вы могли получить к нему доступ, не требуя экземпляра поставщика?
Не могли бы вы сами прочитать атрибут?
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);
}