代码之家  ›  专栏  ›  技术社区  ›  Tom Juergens

UITypeEditor和IExtenderProvider

  •  2
  • Tom Juergens  · 技术社区  · 16 年前

    我有一个扩展程序(IExtenderProvider),它扩展了 具有其他属性的控件。对于其中一个属性,我有 编写了一个UITypeEditor。到目前为止,一切正常。

    用作UITypeEditor的默认类型。我想做的是 能够在扩展程序本身(而不是扩展控件)上设置属性, 当我打开UITypeEditor以获取 作为扩展控件,我想在UITypeEditor中将值设置为 扩展程序上的属性。

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

    UITypeEditor.EditValue,在调用之前 iWindowFormsEditorService.DropDownControl或.ShowDialog。

    唯一的问题是我不能(或者我还没有发现如何)抓住 控制,但在这种情况下这对我没用。

    谢谢


    @萨姆贾德森:这个主意不错,但不幸的是,它并没有把我带到那里。我非常希望能够为扩展程序提供程序的每个实例单独设置此默认值。(对于不同的扩展控件组,一个窗体上可能有多个值不同的窗体。)

    3 回复  |  直到 14 年前
        1
  •  2
  •   Keith    16 年前

    你能自己读一下这个属性吗?

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

    我使用了Linq来简化代码,但是在.Net 1中可以做类似的事情

        2
  •  1
  •   Larry    15 年前

    嗨,我找到了这个: 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);
            }
    
        3
  •  0
  •   samjudson    16 年前

    您是否考虑过将DefaultValue添加为扩展程序提供程序的静态属性,然后无需提供程序的实例就可以访问它?