编程语言
首页 > 编程语言> > c# – 在UITypeEditor的EditValue中访问其他上下文数据

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