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