Объедините ExpandableObjectConverter с выпадающим списком - PullRequest
0 голосов
/ 18 декабря 2018

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

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

Тем не менее мне нужно набрать некоторую строку для созданияновый экземпляр.

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

1 Ответ

0 голосов
/ 21 декабря 2018

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

Пример

В качестве примера, скажем, xlass A имеет свойствотипа B, и мы хотим позволить пользователю выбрать некоторые предопределенные значения для B из раскрывающегося списка в сетке свойств.

После того, как вы выберете что-то из выпадающего списка, B будет инициализирован, и вы по-прежнему сможете редактировать C:

enter image description here

Вот определение для 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);
    }
}
...