Как отобразить список динамических объектов в сетке свойств xceed с помощью iCustomTypeDescriptor - PullRequest
0 голосов
/ 23 января 2019

Я использую customTypeDescriptor для заполнения своей таблицы свойств свойствами.Теперь, когда одно свойство изменяется в этой сетке свойств.Я хотел бы заполнить раскрывающийся список динамическими объектами, полученными в результате изменений в предыдущем свойстве.Я не могу использовать enum, так как это было бы простым решением.

Я пробовал несколько подходов с различными customTypeDescriptors и TypeConverters.Ни один из них, казалось, не работал.Нажмите здесь или нажмите здесь .

У меня есть свой propertyGrid, где я установил SelectedObject:

    Hashtable Something = new Hashtable();
        var col = collection of properties
        foreach (var property in col)
            Something.Add(property.Name, property.value);

        //Add code for dropdown (this does not work)
        string[] array1 = new string[] { "Audi", "BMW", "Mercedes", "Skoda", "Fiat" };
        Something.Add("List of cars", array1);            

        pgrZoneSettings.SelectedObject = null;
        pgrZoneSettings.SelectedObject = new DictionaryPropertyGridAdapter(Something);

DictionaryPropertyGridAdaptor:

public class DictionaryPropertyGridAdapter : ICustomTypeDescriptor
{
    IDictionary _dictionary;

    public DictionaryPropertyGridAdapter(IDictionary d)
    {
        _dictionary = d;
    }

    public string GetComponentName()
    {
        return TypeDescriptor.GetComponentName(this, true);
    }

    public EventDescriptor GetDefaultEvent()
    {
        return TypeDescriptor.GetDefaultEvent(this, true);
    }

    public string GetClassName()
    {
        return TypeDescriptor.GetClassName(this, true);
    }

    public EventDescriptorCollection GetEvents(Attribute[] attributes)
    {
        return TypeDescriptor.GetEvents(this, attributes, true);
    }

    EventDescriptorCollection System.ComponentModel.ICustomTypeDescriptor.GetEvents()
    {
        return TypeDescriptor.GetEvents(this, true);
    }

    public TypeConverter GetConverter()
    {
        return TypeDescriptor.GetConverter(this, true);
    }

    public object GetPropertyOwner(PropertyDescriptor pd)
    {
        return this;
    }

    public AttributeCollection GetAttributes()
    {
        return TypeDescriptor.GetAttributes(this, true);
    }

    public object GetEditor(Type editorBaseType)
    {
        return TypeDescriptor.GetEditor(this, editorBaseType, true);
    }

    public PropertyDescriptor GetDefaultProperty()
    {
        return null;
    }

    PropertyDescriptorCollection
        System.ComponentModel.ICustomTypeDescriptor.GetProperties()
    {
        return ((ICustomTypeDescriptor)this).GetProperties(new Attribute[0]);
    }

    public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        ArrayList properties = new ArrayList();
        foreach (DictionaryEntry e in _dictionary)
        {
            properties.Add(new DictionaryPropertyDescriptor(_dictionary, e.Key));
        }

        PropertyDescriptor[] props =
            (PropertyDescriptor[])properties.ToArray(typeof(PropertyDescriptor));

        return new PropertyDescriptorCollection(props);
    }


    class DictionaryPropertyDescriptor : PropertyDescriptor
    {
        IDictionary _dictionary;
        object _key;

        internal DictionaryPropertyDescriptor(IDictionary d, object key)
            : base(key.ToString(), null)
        {
            _dictionary = d;
            _key = key;
        }

        public override Type PropertyType
        {
            get { return _dictionary[_key].GetType(); }
        }

        public override void SetValue(object component, object value)
        {
            _dictionary[_key] = value;
        }

        public override object GetValue(object component)
        {
            if (this.PropertyType.IsEnum)
                return _dictionary[_key];
            else
                return _dictionary[_key];
        }

        public override bool IsReadOnly
        {
            get { return false; }
        }

        public override Type ComponentType
        {
            get { return null; }
        }

        public override bool CanResetValue(object component)
        {
            return false;
        }

        public override void ResetValue(object component)
        {
        }

        public override bool ShouldSerializeValue(object component)
        {
            return false;
        }
    }
}

В моем списке свойств я могу пройти через перечисление с классом TypeConverter для визуализации описания:

public class ToolsTypeConverter : EnumConverter
{
    public ToolsTypeConverter(Type type) : base(type)
    {
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        return (destinationType == typeof(string));
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (value is ToolsForDistribution)
        {
            ToolsForDistribution x = (ToolsForDistribution)value;

            return EnumExtensions.GetDescription(x);
        }
        return base.ConvertFrom(context, culture, value);
    }
}

Класс перечисления:

[TypeConverter(typeof(ToolsTypeConverter))]
public enum ToolsForDistribution
{
    [Description("Test1")]
    test1,
    [Description("Test2")]
    test2
}

Все свойствапоказано очень красиво.Перечисление также выбирает описание.Я просто не могу понять, как получить список в моей таблице свойств.Мне бы хотелось иметь такой же выпадающий список, как и в enum, но я бы хотел динамически изменять значения в коде, поэтому используйте список или что-то еще.

...