我正在尝试向类型为IList<Control>
的用户控件添加一个属性,并且我已经实现了一个UITypeEditor来向用户显示来自表单的CheckedListBox控件,并允许用户识别哪些控件来自包括。到目前为止,此工作正常。
但是当我尝试关闭UITypeEditor时,Designer会显示一条消息“属性值无效”,其中包含以下详细信息:
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初始化一个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);
}
}
答案 0 :(得分:0)
对此似乎工作得相对较好的解决方法是将属性更改为IList并改为存储控件名称。然后,当您需要访问控件时,只需通过其名称查找每个控件。