UITypeEditor和IExtenderProvider

时间:2008-08-25 20:31:15

标签: .net winforms design-time uitypeeditor iextenderprovider

我有一个扩展器(IExtenderProvider),它扩展了某些类型 具有附加属性的控件。对于其中一个属性,我有 写了一个UITypeEditor。到目前为止,一切正常。

扩展器本身也有一些属性,我正在努力 用作UITypeEditor的一种默认值。我想做的就是 能够在扩展器本身(而不是扩展控件)上设置属性, 当我为其中一个附加属性打开UITypeEditor时 一个扩展控件,我想在UITypeEditor中设置一个值为该值 扩展器上的属性。

一个简单的例子:ExtenderProvider有一个属性DefaultExtendedValue。在表单上,​​我将此属性的值设置为“我的值”。扩展控件通过提供程序具有带有UITypeEditor的属性ExtendedValue。当我打开属性ExtendedValue的编辑器时,默认(初始)值应设置为“我的值”。

在我看来,做到这一点的最佳地点就是 UITypeEditor.EditValue,就在调用之前 IWindowsFormsEditorService.DropDownControl或.ShowDialog。

唯一的问题是我不能(或者我还没有发现如何)抓住 在EditValue中扩展程序提供程序本身,读取有问题的属性的值并在UITypeEditor中设置它。上下文给了我扩展 控制,但在这种情况下对我没用。

有没有办法实现我正在尝试的目标?任何帮助表示赞赏!

由于 汤姆


@samjudson:这不是一个坏主意,但不幸的是它并不能让我在那里。我真的希望能够为扩展程序提供程序的每个实例单独设置此默认值。 (对于不同的扩展控件组,我可能在一个表单上有多个不同的值。)

3 个答案:

答案 0 :(得分:2)

你能自己阅读这个属性吗?

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

我使用Linq来简化代码,但你可以在.Net 1

中做类似的事情

答案 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);
        }

答案 2 :(得分:0)

您是否考虑过将DefaultValue添加为ExtenderProvider的静态属性,然后您可以访问它而无需提供者的实例?