UITypeEditor和IExtenderProvider

时间:2020-03-05 18:42:59  来源:igfitidea点击:

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

扩展器本身也具有几个属性,我正在尝试
用作UITypeEditor的默认类型。我想做的是
能够在扩展程序本身(而不是扩展控件)上设置属性,
当我打开UITypeEditor上的其他属性之一时
扩展控件,我想将UITypeEditor中的值设置为该值
扩展器上的属性。

一个简单的示例:ExtenderProvider具有属性DefaultExtendedValue。在表单上,​​我将此属性的值设置为"我的值"。扩展控件通过提供程序具有带有UITypeEditor的属性ExtendedValue。当我打开属性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);
        }