我正在调整winforms应用程序。此应用程序具有包含FormPropertyGrid。对象被分配给SelectedObject属性,以便属性网格显示对象的属性。
指定对象的类型具有一个属性,该属性带有指定aEditorAttributeUITypeEditor
这个UITypeEditor的实现在重写UITypeEditorEditStyle.Drop方法时返回GetEditStyle。它的EditValue方法显示一个ListBox,可以从中分配实例属性的值。
到目前为止一切都很好。
现在,我有一个额外的要求,要求根据宿主Form的其他状态修改列表中的可用项。我不知道如何将这些上下文信息传递到PropertyGrid方法。
即使我尝试将其强制转换为更特定的类型,EditValue参数上似乎没有任何内容。我也不知道如何添加其他服务来从context中检索。
有什么想法吗?

最佳答案

我想知道作为一个TypeConverter通过GetStandardValues的人,你想做什么会更好?但无论哪种方式,context.Instancecontext.PropertyDescriptor似乎都是在快速测试中填充的(对于GetEditStyleEditValue):

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()
                }
            }
        });
    }
}

09-06 06:44