UITypeEditor 和 IExtenderProvider

Posted

技术标签:

【中文标题】UITypeEditor 和 IExtenderProvider【英文标题】:UITypeEditor and IExtenderProvider 【发布时间】:2008-08-25 20:31:14 【问题描述】:

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

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

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

在我看来,最好的地方是 UITypeEditor.EditValue,就在调用之前 IWindowsFormsEditorService.DropDownControl 或 .ShowDialog。

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

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

谢谢 汤姆


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

【问题讨论】:

【参考方案1】:

你能自己读一下属性吗?

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

我使用 Linq 来简化代码,但您可以在 .Net 1 中执行类似的操作

【讨论】:

【参考方案2】:

您好,我找到了这个: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】:

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

【讨论】:

以上是关于UITypeEditor 和 IExtenderProvider的主要内容,如果未能解决你的问题,请参考以下文章

WPF PropertyGrid 绑定时间控件属性问题

VSIX 项目 - 属性工具窗口扩展

怎样响应propertygrid控件中集合编辑器的确定事件

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]