2

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

扩展器本身也有几个属性,我试图将它们用作 UITypeEditor 的一种默认值。我想要做的是能够在扩展器本身(而不是扩展控件)上设置一个属性,并且当我为扩展控件上的一个附加属性打开 UITypeEditor 时,我想在UITypeEditor 为扩展器上的属性值。

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

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

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

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

谢谢汤姆


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

4

3 回答 3

2

你能自己读一下属性吗?

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

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

于 2008-10-09T13:33:44.580 回答
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);
        }
于 2010-02-03T15:26:07.200 回答
0

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

于 2008-08-27T14:26:32.943 回答