C# 将ExpandableObjectConverter与下拉列表组合

C# 将ExpandableObjectConverter与下拉列表组合,c#,.net,winforms,propertygrid,C#,.net,Winforms,Propertygrid,我的类中有一个可为null的属性,我希望用户能够使用PropertyGrid创建其实例。这是我使用ExpandableObjectConverter完成的 创建实例时,它会自动显示在PropertyGrid中,可以展开实例并更改其属性值 我仍然需要键入一些字符串来创建一个新实例 这就是为什么我想知道是否可以将ExpandableObjectConverter与DropDownList结合起来。因此,用户可以选择一个现有值。您需要创建一个新的ExpandableObjectConverter,支持

我的类中有一个可为null的属性,我希望用户能够使用PropertyGrid创建其实例。这是我使用
ExpandableObjectConverter
完成的

创建实例时,它会自动显示在PropertyGrid中,可以展开实例并更改其属性值

我仍然需要键入一些字符串来创建一个新实例


这就是为什么我想知道是否可以将
ExpandableObjectConverter
与DropDownList结合起来。因此,用户可以选择一个现有值。

您需要创建一个新的
ExpandableObjectConverter
,支持标准值

示例

例如,假设xlass
A
具有类型为
B
的属性,我们希望用户能够从属性网格中的下拉列表中为
B
选择一些预定义值

从下拉列表中选择内容后,
B
将被初始化,您仍然可以编辑
C

以下是
A
B
的定义:

public class A
{
    [TypeConverter(typeof(BConverter))]
    public B B { get; set; }
}
public class B : ICloneable
{
    [RefreshProperties(RefreshProperties.All)]
    public string C { get; set; }
    public object Clone()
    {
        return new B { C = this.C };
    }
    public override string ToString()
    {
        return C;
    }
}
以下是自定义的
ExpandableObjectConverter

public class BConverter : ExpandableObjectConverter
{
    B[] values = new B[] { new B { C = "Something" }, new B { C = "Something else" } };
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string))
            return true;
        return base.CanConvertFrom(context, sourceType);
    }
    public override object ConvertFrom(ITypeDescriptorContext context, 
        System.Globalization.CultureInfo culture, object value)
    {
        var result = values.Where(x => $"{x}" == $"{value}").FirstOrDefault();
        if (result != null)
            return result.Clone();
        return base.ConvertFrom(context, culture, value);
    }
    public override bool GetStandardValuesSupported(ITypeDescriptorContext c)
    {
        return true;
    }
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext c)
    {
        return true;
    }
    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext c)
    {
        return new StandardValuesCollection(values);
    }
}

有一种方法可以创建
PropertyGrid
@Sinatr——据我所知,UITypeEditor提供了下拉和自定义表单之间的选择。但我不能将可扩展布局与下拉组合,对吗?您只需要将该属性与枚举数设置/关联即可。定义一个公共枚举MyPropertySettings(…),然后在属性定义中:
[Category(“Category”),DefaultValue(MyPropertySettings.PropertyValue1)]公共MyPropertySettings MyProperty{get;set;}=MyPropertySettings.PropertyValue1。选中后,将使用标准下拉控件设置该特性值。