我创建了一个继承自ComboBox的所有者绘制用户控件。
控件存储专用项,但Items集合仍然接受并返回Object类型的项。有关覆盖此集合的最佳方法的任何提示都是类型安全的吗?
关于我能想到的唯一方法是创建我自己的集合类。该类不是真正的集合 - 它将ObjectCollection作为构造函数的参数,并简单地将其方法扩展为。
用户控件会将原始Items集合传递给新类的构造函数。然后重写Items属性以返回新类的实例。
这似乎有点令人费解。还有更好的方法吗?
答案 0 :(得分:1)
你可以通过几种不同的方式做到这一点。首先,我对你创建一个继承自ComboBox的“用户控件”感到有些困惑。您可以创建一个继承自ComboBox的自定义控件,但不能从UserControl(通常是“用户控件”的定义)和ComboBox继承。
如果你定义一个真正的UserControl衍生物,这会变得容易一些。像我说的那样,UserControl不能 一个ComboBox,但它可以拥有一个ComboBox。因此,您可以将ComboBox拖放并停靠到UserControl表面,然后重新实现您需要能够使用的任何属性,例如Items。这将允许您将项目重新创建为您选择的集合,可能是强类型列表。唯一的问题是确切地知道你想要重新实现的内容; ComboBox有很多有用的属性,除非你实现了一个修改了UserControl中包含的ComboBox的“传递”属性,否则你将无法在Designer或代码中访问它。
如果你直接从ComboBox继承,它会在某些方面获得一点点转向,在其他方面更容易。您可以通过定义自己的项目并使用new
关键字来隐藏项目的基类实现。执行此操作时,可以更改可见性,类型和其他修改器。这将阻止使用基类上的对象数组处理作为CustomComboBox(或任何名称)的控件的代码;他们必须使用强类型的Items数组。您的新属性仍然可以访问旧属性(为了使其工作,它将需要它)。您还可以免费获得ComboBox的所有其他公共属性;你只需要重新实现你想要改变的东西。但是,将您的自定义ComboBox称为任何基类将导致运行时使用对该类有效的Items版本;也就是说,对象数组,而不是强类型对象。