Вам не хватает нескольких переопределений методов в дескрипторе типа:
public class BarConverter : ExpandableObjectConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(InstanceDescriptor))
return true;
return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(InstanceDescriptor))
{
ConstructorInfo ci = typeof(Bar).GetConstructor(new Type[] { typeof(string) });
Bar t = (Bar)value;
return new InstanceDescriptor(ci, new object[] { t.Text });
}
return base.ConvertTo(context, culture, value, destinationType);
}
public override object CreateInstance(ITypeDescriptorContext context,
IDictionary propertyValues)
{
if (propertyValues == null)
throw new ArgumentNullException("propertyValues");
object text = propertyValues["Text"];
return new Bar((string)text);
}
public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
{
return true;
}
}
И добавить конструктор в структуру:
[TypeConverter(typeof(BarConverter))]
public struct Bar
{
public Bar(string text)
{
Text = text;
}
public string Text { get; set; }
}
И вот как свойство Bar
сериализуется:
//
// userControl11
//
this.userControl11.Bar = new SampleWinApp.Bar("Something");
И свойство bar будет показано как следующее изображение в сетке свойств, имеющее свойство Text
editable:
Вы также можете предоставить лучшее строковое представление для структуры, переопределив ее ToString()
метод структуры, а также сделать свойство конвертируемым из строки в сетке свойств, переопределив CanConvertFrom
и ConvertFrom
like PointConverter
или SizeConverter
.