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的主要内容,如果未能解决你的问题,请参考以下文章