我正在尝试向我的用户控件类型添加一个属性IList<Control>
,并且我已经实现了一个 UITypeEditor 来向用户显示表单中控件的 CheckedListBox 并允许用户识别要包含的控件。到目前为止,这工作正常。
但是当我尝试关闭 UITypeEditor 时,设计器会显示一条消息“属性值无效”,其中包含以下详细信息:
Type 'System.Windows.Forms.Control' in Assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.
我不确定这是否可以通过 TypeConverter 解决,但如果是,我不确定 TypeConverter 应该从该ConvertTo
方法返回什么(因为您无法从构造函数初始化 List,并且它需要引用我不确定如何传回的控件)。
如有必要,我可以将类型更改为 Control[] 如果这样可以解决从构造函数初始化的问题。
编辑:我尝试了这个 TypeConverter,但尽管将它与用户控件上的属性相关联,但它似乎并没有以任何方式使用。
class ControlListConverter : TypeConverter {
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, System.Globalization.CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(InstanceDescriptor) && value is IList<Control>) {
IList<Control> list = (IList<Control>)value;
ConstructorInfo ctor = typeof(List<Control>).GetConstructor(new Type[] {typeof(IEnumerable<Control>)});
if (ctor != null) {
return new InstanceDescriptor(ctor, new object[] { list });
}
}
return base.ConvertTo(context, culture, value, destinationType);
}
}