PropertyGrid->从列表<对象>选择对象

时间:2018-10-18 15:43:16

标签: c# propertygrid

是否可以在propertyGrid中使用列表(如选择组合框)?

例如,是否可以有一个这样的类:

.dispose()

然后在propertyGrid中,让我选择“酒吧”列表中的对象之一。

2 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案:

您需要具有静态对象列表变量的派生转换器类:

    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-Constructor中所做的那样。

编辑:该列表将显示您添加到列表中的每个对象的ToString()方法返回值。

答案 1 :(得分:0)

这不是直接的答案,但是如果您知道在编译时使用了多少个对象,则可以在后台使用与字典配对的枚举。

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

然后使用属性网格上的枚举确保您拥有一个属性