Я использую 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, но я бы хотел динамически изменять значения в коде, поэтому используйте список или что-то еще.