Объедините ExpandableObjectConverter с выпадающим списком

У меня есть свойство nullable в моем классе, и я хочу, чтобы пользователь мог создавать его экземпляр с помощью PropertyGrid. Который я использовал ExpandableObjectConverter,

Когда экземпляр создается, он автоматически появляется в PropertyGrid с возможностью его расширения и изменения значений его свойств.

Тем не менее мне нужно ввести строку для создания нового экземпляра.

Вот почему я задаюсь вопросом, можно ли совместить ExpandableObjectConverter с DropDownList. Таким образом, пользователь сможет выбрать одно из существующих значений.

1 ответ

Решение

Вам нужно создать новый 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);
    }
}
Другие вопросы по тегам