将ExpandableObjectConverter与下拉列表结合使用

时间:2018-12-18 11:55:35

标签: c# .net winforms propertygrid

我的班级中有一个可为空的属性,我希望用户能够使用PropertyGrid创建其实例。我使用ExpandableObjectConverter做过的。

创建实例后,它会自动出现在PropertyGrid中,并具有扩展它并更改其属性值的作用。

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

这就是为什么我想知道是否可以将ExpandableObjectConverter与DropDownList结合使用。这样用户就可以选择现有值之一。

1 个答案:

答案 0 :(得分:0)

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

示例

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

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

enter image description here

这是AB的定义:

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);
    }
}
相关问题