PropertyGrid -> Выбрать объект из списка <object> - PullRequest
0 голосов
/ 18 октября 2018

Есть ли способ использовать список, например, выпадающий список выбора в propertyGrid?

Например, можно ли создать такой класс:

public class Foo
{
    [DisplayName(nameof(SelectedBar)),
    Browsable(true)]
    public Bar SelectedBar { get; set; } = null;

    [Browsable(false)]
    public List<Bar> Bars { get; set; } = new List<Bar>() { new Bar("Bar0"), new Bar("Bar1"), new Bar("Bar2") };
}

public class Bar
{
    public string Name;

    public Bar(string name) { Name = name; }

    public override string ToString()
    {
        return Name;
    }
}

И вpropertyGrid позволяет мне выбрать один из объектов в списке «Bar».

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Это не прямой ответ, но если вы знаете, какие / сколько объектов вы используете во время компиляции, вы можете использовать enum в паре со словарем на заднем плане.

public enum someEnum {name1, name2, name3}
Dictionary<someEnum, object> backEndDictionary = new Dictionary<someEnum, object>();
backEndDictionary[someEnum.name1] = object1;
...

А затем просто сделатьуверен, что у вас есть свойство, используя перечисление в вашей сетке свойств

0 голосов
/ 18 октября 2018

Хорошо, я нашел решение для этого:

Вам нужен производный класс преобразователя со статической переменной списка объектов:

    public class ListStringConverter: StringConverter
    {
        public static List<object> Objects = new List<object>();

        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            return new StandardValuesCollection(Objects);
        }
    }

И добавьте атрибут TypeConverter-Attribute с вашим преобразователем впеременная selectedObject:

public class Foo
{
    public Foo()
    {
        ObjectListStringConverter.Objects = new List<object>(){ new Bar("Bar0"), new Bar("Bar1"), new Bar("Bar2") };
    }

    [DisplayName(nameof(SelectedBar)),
     Browsable(true),
     TypeConverter(typeof(ObjectListStringConverter))]
    public Bar SelectedBar { get; set; } = null;
}

public class Bar
{
    public string Name;

    public Bar(string name) { Name = name; }

    public override string ToString()
    {
        return Name;
    }
}

И в какой-то момент вам необходимо заполнить переменную статического списка объектов вашего класса-конвертера объектами, которые вы хотите иметь в своем списке, как я это сделал в Foo-Конструктор выше.

РЕДАКТИРОВАТЬ: В списке будет показано возвращаемое значение метода ToString () для каждого объекта, который вы добавили в список.

...