自定义TypeConverter和设计器中的嵌套属性的问题

时间:2010-08-25 16:49:43

标签: c# properties designer typeconverter

我正在尝试使用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。

1 个答案:

答案 0 :(得分:2)

它无法显示对象的属性,因为该对象为null。尝试在UserControl1构造函数中创建一个新对象:

public partial class UserControl1 : UserControl
{
    public TestNestedOption TestOption { get; set; }

    public UserControl1()
    {
        InitializeComponent();
        TestOption = new TestNestedOption();
    }
}

此外,您不必为此编写自定义TypeConverter,而只需使用ExpandableObjectConverter,这与您编写的内容完全相同。如果您需要覆盖其他方法,您仍可能希望继承它。