UITypeEditor и IExtenderProvider

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

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

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

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

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

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

Спасибо Том


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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 669
3

Ответы 3

Рассматривали ли вы добавление 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);
        }

Другие вопросы по теме