나는 비슷한 상황에 있었고, 나는 커스텀 UITypeEditor의 생성자에 객체를 삽입하고 싶었다.
Nicolas Cadilhac의 설명에이어서 Here, HILL THE CREDIT. 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();
}
}
마이클
마크는, 아마도 내 질문에 조정이 필요
덕분에, 나는 그리드의'SelectedObject' 속성에 할당 된 객체가 보관 유지하는 값을 __isn't__ _form_ 보유 값에 접근 할 필요가 . – AnthonyWJones
@Anthony - 양식을 얻는 것이 까다로울 수 있습니다. 인스턴스로 추상화 할 수있는 방법이 있습니까? –
나는 내가 할 수 있었다고 생각한다. 그러나 나는 다른 길이 있기를 바라고 있었다. 필자는 애플리케이션 아키텍처의 이익을 위해 객체를 운반하는 데이터를 오염시키고 싶지 않습니다. 추가 데이터에 액세스하는 다른 방법으로는 폼 자체 일 필요는 없습니다. 즉, IServiceProvider의 역할입니다.하지만이 컨텍스트에서 제공 할 서비스를 추가하는 방법을 찾을 수는 없습니다. – AnthonyWJones