我是在類似的情況下,我想注入一個對象到我的自定義UITypeEditor的構造函數。
我跟着Nicolas Cadilhac在Here的評論,給他所有的信用。它使用TypeDescriptionProvider。
這是完整的代碼集。
class Foo
{
public Foo() { Bar = new Bar(); }
public Bar Bar { get; set; }
}
class Bar
{
public string Value { get; set; }
}
class BarTypeDescriptionProvider : TypeDescriptionProvider
{
private TypeDescriptionProvider _baseProvider;
string _extraParam;
public BarTypeDescriptionProvider(Type t, string extraParam)
{
this._extraParam = extraParam;
_baseProvider = TypeDescriptor.GetProvider(t);
}
public string ExtraParam
{
get { return _extraParam; }
}
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
{
return new BarTypeDescriptor(this, _baseProvider.GetTypeDescriptor(objectType, instance), objectType);
}
}
class BarTypeDescriptor : CustomTypeDescriptor
{
private Type _objectType;
private BarTypeDescriptionProvider _provider;
public BarTypeDescriptor(BarTypeDescriptionProvider provider, ICustomTypeDescriptor descriptor, Type objectType): base(descriptor)
{
if (provider == null) throw new ArgumentNullException("provider");
if (descriptor == null)
throw new ArgumentNullException("descriptor");
if (objectType == null)
throw new ArgumentNullException("objectType");
_objectType = objectType;
_provider = provider;
}
public override object GetEditor(Type editorBaseType)
{
return new BarEditor(_provider.ExtraParam);
}
}
class BarEditor : UITypeEditor
{
private string _extraParam;
public BarEditor(string x)
: base()
{
_extraParam = x;
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
MessageBox.Show(_extraParam);
return base.EditValue(context, provider, value);
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string extraParam = "Extra param from main form";
TypeDescriptor.AddProvider(new BarTypeDescriptionProvider(typeof(Bar), extraParam), typeof(Bar));
this.propertyGrid1.SelectedObject = new Foo();
}
}
邁克爾
感謝馬克,或許是我的問題需要調整,我需要訪問由__isn't__分配給電網的'SelectedObject'屬性由對象保存的值_form_保持的值。 – AnthonyWJones 2010-03-29 16:36:13
@Anthony - 獲取表單會很棘手 - 有什麼方法可以將它抽象到實例中嗎? – 2010-03-29 18:27:14
我想我可以但我希望有另一種方式。我並不想污染攜帶數據的對象來滿足應用程序架構的興趣。它不一定是形式本身,而是其他訪問額外數據的方式,這實際上是「IServiceProvider」的角色,但我無法在此上下文中找到添加自己的服務的方法。 – AnthonyWJones 2010-03-30 07:11:32