UITypeEditor и IExtenderProvider - PullRequest
       40

UITypeEditor и IExtenderProvider

2 голосов
/ 26 августа 2008

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

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

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

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

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

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

Спасибо Том


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

Ответы [ 3 ]

2 голосов
/ 09 октября 2008

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

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

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

1 голос
/ 03 февраля 2010

Привет, я нашел это: 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);
        }
0 голосов
/ 27 августа 2008

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

...