关于.net:UITypeEditor和IExtenderProvider

关于.net:UITypeEditor和IExtenderProvider

UITypeEditor and IExtenderProvider

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

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

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

在我看来,执行此操作的最佳位置是
UITypeEditor.EditValue,在调用之前
IWindowsFormsEditorService.DropDownControl或.ShowDialog。

唯一的问题是我无法(或我尚未发现如何)获得控制权
扩展提供者本身在EditValue中的值,以读取相关属性的值并在UITypeEditor中进行设置。上下文给了我扩展
控制,但在这种情况下对我没有用。

有什么办法可以实现我正在尝试的功能?任何帮助表示赞赏!

谢谢
汤姆

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


您可以自己读取属性吗?

1
2
3
4
5
6
7
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/zh-CN/winformsdesigner/thread/07299eb0-3e21-42a3-b36b-12e37282af83/

基本上:

1
2
3
4
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应该通过以下方式实现:

1
2
3
4
5
6
7
8
9
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);
        }

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


推荐阅读