繁体   English   中英

重写ComboBox.Items的最佳方法

[英]Best Way to Override ComboBox.Items

我创建了一个继承自ComboBox的所有者绘制用户控件。

该控件存储特殊项目,但是Items集合仍接受并返回Object类型的项目。 关于覆盖此集合以确保其类型安全的最佳方法的任何技巧?

我能想到的唯一方法是创建自己的集合类。 该类将不是一个真正的集合,它将一个ObjectCollection作为构造函数的参数,并简单地将其方法扩展到。

用户控件会将原始的Items集合传递给新类的构造函数。 然后重写Items属性以返回新类的实例。

这似乎有些令人费解。 有没有更好的办法?

您可以通过几种不同的方式来做到这一点。 首先,我对您创建一个从ComboBox继承的“用户控件”感到有些困惑。 您可以创建从ComboBox继承的自定义控件 ,但是不能同时从UserControl(这是“用户控件”的通常定义)和ComboBox继承。

如果您定义了一个真正的UserControl派生类,这会变得容易一些。 就像我说的,UserControl不能 ComboBox,但是可以具有 ComboBox。 因此,您可以将ComboBox拖放到UserControl曲面上,然后重新实现需要使用的所有属性,例如Items。 这将使您可以重新创建项目作为您选择的集合,可能是强类型的列表。 唯一的问题是确切知道要重新实现的内容。 ComboBox有很多有用的属性,除非您实现了一个“传递”属性,该属性可以修改UserControl中包含的ComboBox,否则您将无法在Designer或代码中访问它。

如果直接从ComboBox继承,则它在某些方面会变得有些欺骗,而在其他方面则更容易。 您可以通过定义自己的项目并使用new关键字来隐藏Items的基类实现。 您可以在执行此操作时更改可见性,类型和其他修饰符。 这将防止与作为CustomComboBox(或您命名的控件)的控件一起处理的代码使用基类上的对象数组。 他们必须使用您的强类型Items数组。 您的新媒体资源仍可以访问旧媒体资源(为了使其正常工作,需要访问该媒体资源)。 您还可以免费获得ComboBox的所有其他公共属性; 您只需重新实现要更改的内容。 但是,将您的自定义ComboBox称为任何基类将导致运行时使用对该类有效的Items版本。 即对象数组,而不是您的强类型数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM