如何确定UserControl集合属性在设计时已更改?

时间:2011-06-20 22:39:08

标签: c# winforms user-controls .net-2.0

我有一个UserControl,它有一个collection属性。我的部分要求是控件的GUI根据集合的内容在DesignMode中修改自身。例如,Think ListBox。

我的代码看起来像这样(Add的覆盖只是一个实验):

public partial class MyControl: UserControl
{
    public class StringCollection : List<string>
    {
        public new void Add(string item)
        {
            Console.Beep();
            base.Add(item);
        }
    }       

    [Category("Data")]
    [Description("The items to be displayed in the Control.")] 
    [Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design", typeof(System.Drawing.Design.UITypeEditor))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public StringCollection Items
    {
        get
        {
            return mItems;
        }
    }

除了在设计时发现通过StringCollectionEditor修改了Collection之外,一切正常。我在控件创建上得到“Beeps”,如果我从代码添加到集合中。

我知道可以完成,因为ListBox可以做到。有人有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

这是 new 关键字的问题,它无法神奇地使方法成为虚拟。 StringCollectionEditor将调用IList.Add()来添加项。这将调用List&lt;&gt; .Add(),而不是您的版本。你必须放弃List&lt;&gt;并实现自己的继承自IList的集合类。这是一项无聊的工作,你使用List&lt;&gt;实现它。像这样:

    class StringCollection : System.Collections.IList {
        private List<object> impl = new List<object>();
        public int Add(object value) {
            Console.Beep();
            impl.Add(value);
            return Count;
        }

        public void Clear() {
            impl.Clear();
        }

        // etc...
    }

注意ListBox如何做到这一点,它使用ObjectCollection。也许你也可以使用它。请记住,Winforms是在泛型可用之前创建的。