我有一个扩展器(IExtenderProvider),它扩展了某些类型 具有附加属性的控件。对于其中一个属性,我有 写了一个UITypeEditor。到目前为止,一切正常。
扩展器本身也有一些属性,我正在努力 用作UITypeEditor的一种默认值。我想做的就是 能够在扩展器本身(而不是扩展控件)上设置属性, 当我为其中一个附加属性打开UITypeEditor时 一个扩展控件,我想在UITypeEditor中设置一个值为该值 扩展器上的属性。
一个简单的例子:ExtenderProvider有一个属性DefaultExtendedValue。在表单上,我将此属性的值设置为“我的值”。扩展控件通过提供程序具有带有UITypeEditor的属性ExtendedValue。当我打开属性ExtendedValue的编辑器时,默认(初始)值应设置为“我的值”。
在我看来,做到这一点的最佳地点就是 UITypeEditor.EditValue,就在调用之前 IWindowsFormsEditorService.DropDownControl或.ShowDialog。
唯一的问题是我不能(或者我还没有发现如何)抓住 在EditValue中扩展程序提供程序本身,读取有问题的属性的值并在UITypeEditor中设置它。上下文给了我扩展 控制,但在这种情况下对我没用。
有没有办法实现我正在尝试的目标?任何帮助表示赞赏!
由于 汤姆
答案 0 :(得分:2)
你能自己阅读这个属性吗?
DefaultValueAttribute att = context.
PropertyDescriptor.Attributes.
OfType<DefaultValueAttribute>().
FirstOrDefault();
object myDefault = null;
if ( att != null )
myDefault = att.Value;
我使用Linq来简化代码,但你可以在.Net 1
中做类似的事情答案 1 :(得分:1)
基本上:
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);
}
答案 2 :(得分:0)
您是否考虑过将DefaultValue添加为ExtenderProvider的静态属性,然后您可以访问它而无需提供者的实例?