我正在尝试使用TypeConverter向我的自定义控件添加嵌套属性,这是我的测试代码:
public class TestNestedOptionConverter : TypeConverter
{
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context,
object value, Attribute[] filter)
{
return TypeDescriptor.GetProperties(typeof(TestNestedOption));
}
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}
}
[TypeConverter(typeof(TestNestedOptionConverter))]
public class TestNestedOption
{
bool test1 = false;
[Description("TestParam1")]
public bool Test1
{
get { return test1; }
set { test1 = value; }
}
[Description("TestParam2")]
public int Test2 { get; set; }
}
public partial class UserControl1 : UserControl
{
public TestNestedOption TestOption { get; set; }
public UserControl1()
{
InitializeComponent();
}
}
当我将控件添加到表单时,我在设计器属性网格中看到了TestOption属性,但子属性根本没有显示(TestOption旁边甚至没有扩展框)。
我对此的理解是它应该在每个属性上以递归方式调用GetProperties()
方法,因此作为测试黑客,我在MessageBox.Show()
方法中放置TestNestedOptionConverter.GetProperties()
,当设计器加载控件时我没有看到消息。这让我觉得被覆盖的GetProperties()
由于某种原因从未被设计者调用过。
关于我做错了什么的想法?
我正在使用Visual Studio 2008。
答案 0 :(得分:2)
它无法显示对象的属性,因为该对象为null。尝试在UserControl1构造函数中创建一个新对象:
public partial class UserControl1 : UserControl
{
public TestNestedOption TestOption { get; set; }
public UserControl1()
{
InitializeComponent();
TestOption = new TestNestedOption();
}
}
此外,您不必为此编写自定义TypeConverter,而只需使用ExpandableObjectConverter,这与您编写的内容完全相同。如果您需要覆盖其他方法,您仍可能希望继承它。