我正在尝试使用 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(使用前将#替换为@)