c# – 在UITypeEditor的EditValue中访问其他上下文数据
作者:互联网
我正在调整一个WinForms应用程序.此应用程序具有包含PropertyGrid的窗体.将一个对象分配给SelectedObject属性,以便属性网格显示该对象的属性.
分配的对象类型具有一个属性,该属性带有指定UITypeEditor的EditorAttribute.
UITypeEditor的这个实现在其GetEditStyle方法的重写中返回UITypeEditorEditStyle.Drop.它的EditValue方法显示一个ListBox,可以从中分配实例属性的值.
到目前为止一切顺利.
现在我有一个额外的要求,要求根据托管PropertyGrid的表所持有的其他状态修改列表中的可用项.我无法弄清楚如何将此上下文信息提供给EditValue方法.
即使我尝试将其转换为更具体的类型,上下文参数似乎也没有任何内容.我也不知道如何添加其他服务以从提供程序检索.
有任何想法吗?
解决方法:
我想知道你想要做什么会通过GetStandardValues更好地作为TypeConverter?但无论哪种方式,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()
}
}
});
}
}
标签:c,winforms,propertygrid,uitypeeditor 来源: https://codeday.me/bug/20190526/1159218.html