gpt4 book ai didi

c# - 在 UITypeEditor 的 EditValue 中访问额外的上下文数据

转载 作者:太空狗 更新时间:2023-10-30 00:46:42 26 4
gpt4 key购买 nike

我正在调整 WinForms 应用程序。此应用程序有一个包含 PropertyGridForm。一个对象被分配给 SelectedObject 属性,以便属性网格显示该对象的属性。

分配的对象类型具有一个属性,该属性携带一个 EditorAttribute 指定一个 UITypeEditor

UITypeEditor 的实现在其对 GetEditStyle 方法的覆盖中返回 UITypeEditorEditStyle.Drop。它的 EditValue 方法显示一个 ListBox,可以从中为实例属性分配一个值。

到目前为止一切都很好。

现在我有一个额外的要求,要求根据托管 PropertyGridForm 所持有的其他状态修改列表中的可用项目。我不知道如何将此上下文信息获取到 EditValue 方法。

context 参数似乎没有任何内容,即使我尝试将其转换为更具体的类型。我也不知道如何添加一些其他服务以从 provider 检索。

有什么想法吗?

最佳答案

我处于类似的情况,我想将一个对象注入(inject)到我的自定义 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();
}
}

迈克尔

关于c# - 在 UITypeEditor 的 EditValue 中访问额外的上下文数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2539107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com