Объедините ExpandableObjectConverter с выпадающим списком
У меня есть свойство nullable в моем классе, и я хочу, чтобы пользователь мог создавать его экземпляр с помощью PropertyGrid. Который я использовал ExpandableObjectConverter
,
Когда экземпляр создается, он автоматически появляется в PropertyGrid с возможностью его расширения и изменения значений его свойств.
Тем не менее мне нужно ввести строку для создания нового экземпляра.
Вот почему я задаюсь вопросом, можно ли совместить ExpandableObjectConverter
с DropDownList. Таким образом, пользователь сможет выбрать одно из существующих значений.
1 ответ
Вам нужно создать новый ExpandableObjectConverter
, поддерживая стандартные значения.
пример
В качестве примера, скажем, Xlass A
имеет свойство типа B
и мы хотели бы позволить пользователю выбирать некоторые предопределенные значения для B
из выпадающего списка в сетке свойств.
После того, как вы выберите что-то из выпадающего списка, B
будет инициализирован, и вы все еще можете редактировать C
:
Вот определение для 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);
}
}