我正在调整winforms应用程序。此应用程序具有包含Form
的PropertyGrid
。对象被分配给SelectedObject
属性,以便属性网格显示对象的属性。
指定对象的类型具有一个属性,该属性带有指定aEditorAttribute
的UITypeEditor
。
这个UITypeEditor
的实现在重写UITypeEditorEditStyle.Drop
方法时返回GetEditStyle
。它的EditValue
方法显示一个ListBox
,可以从中分配实例属性的值。
到目前为止一切都很好。
现在,我有一个额外的要求,要求根据宿主Form
的其他状态修改列表中的可用项。我不知道如何将这些上下文信息传递到PropertyGrid
方法。
即使我尝试将其强制转换为更特定的类型,EditValue
参数上似乎没有任何内容。我也不知道如何添加其他服务来从context
中检索。
有什么想法吗?
最佳答案
我想知道作为一个TypeConverter
通过GetStandardValues
的人,你想做什么会更好?但无论哪种方式,context.Instance
和context.PropertyDescriptor
似乎都是在快速测试中填充的(对于GetEditStyle
和EditValue
):
using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
class MyData
{
[Editor(typeof(MyEditor), typeof(UITypeEditor))]
public string Bar { get; set; }
public string[] Options { get; set; }
}
class MyEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
// break point here; inspect context
return UITypeEditorEditStyle.DropDown;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
// break point here; inspect context
return base.EditValue(context, provider, value);
}
}
class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form
{
Controls =
{
new PropertyGrid {
Dock = DockStyle.Fill,
SelectedObject = new MyData()
}
}
});
}
}
或作为类型转换器:
using System;
using System.ComponentModel;
using System.Windows.Forms;
class MyData
{
[TypeConverter(typeof(MyConverter))]
public string Bar { get; set; }
public string[] Options { get; set; }
}
class MyConverter : StringConverter
{
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
MyData data = (MyData)context.Instance;
if(data == null || data.Options == null) {
return new StandardValuesCollection(new string[0]);
}
return new StandardValuesCollection(data.Options);
}
}
class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.Run(new Form
{
Controls =
{
new PropertyGrid {
Dock = DockStyle.Fill,
SelectedObject = new MyData()
}
}
});
}
}