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

2024-02-20

我正在尝试使用 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() in the TestNestedOptionConverter.GetProperties()方法,并且当设计器加载控件时我没有看到消息。这让我认为被覆盖的GetProperties()由于某种原因,设计师从未调用过。

关于我做错了什么有什么想法吗?

我正在使用 Visual Studio 2008。


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

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

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

另外,您不必为此编写自定义 TypeConverter,而是可以使用可扩展对象转换器 http://msdn.microsoft.com/en-us/library/system.componentmodel.expandableobjectconverter.aspx,这正是你所写的。如果您需要重写其他方法,您可能仍然希望继承它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计器中的自定义 TypeConverter 和嵌套属性存在问题 的相关文章

随机推荐