我有一个扩展程序(IExtenderProvider),它用附加的属性扩展某些类型的控件。对于其中一个属性,我编写了一个UITypeEditor。到目前为止,一切正常。
扩展程序本身也有一些属性,我正尝试将其用作UITypeEditor的一种默认设置。我想要做的是能够在扩展程序本身上设置一个属性(而不是扩展控件),当我为扩展控件上的一个附加属性打开UITypeEditor时,我希望在UITypeEditor中将一个值设置为扩展程序上的属性值。
一个简单的例子: ExtenderProvider有一个属性DefaultExtendedValue。在表单上,我将此属性的值设置为“我的值”。扩展控件通过提供程序具有带有ExtendedValue的属性UITypeEditor。打开属性ExtendedValue的编辑器时,默认值(初始值)应该设置为"My Value“。
在我看来,这样做最好的地方是UITypeEditor.EditValue,就在调用IWindowsFormsEditorService.DropDownControl或.ShowDialog之前。
唯一的问题是我不能(或者我还没有发现如何)在EditValue中获取扩展程序提供程序本身,读取所讨论的属性的值并在UITypeEditor中设置它。上下文给了我扩展的控制,但在这种情况下,这对我没有任何用处。
有什么办法能达到我想要的目的吗?任何帮助都很感激!
谢谢汤姆
@samjudson:这主意不错,但不幸的是,它并没有完全把我弄到手。我非常希望能够为扩展程序提供程序的每个实例分别设置这个默认值。(对于不同的扩展控件组,在单个窗体上可能有多个值不同的窗体。)
发布于 2008-10-09 13:33:44
你能自己读一下这个属性吗?
DefaultValueAttribute att = context.
PropertyDescriptor.Attributes.
OfType<DefaultValueAttribute>().
FirstOrDefault();
object myDefault = null;
if ( att != null )
myDefault = att.Value;我使用Linq来简化代码,但您可以在.Net 1中执行类似的操作
发布于 2010-02-03 15:26:07
嗨,我找到了这个: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);
}发布于 2008-08-27 14:26:32
您是否考虑过将DefaultValue添加为ExtenderProvider的静态属性,然后可以访问它而不需要提供程序的实例?
https://stackoverflow.com/questions/26795
复制相似问题