更改继承的.NET控件上属性的默认值

11
在 .NET 中,我拥有一个继承的控件:
public CustomComboBox : ComboBox

我只是想更改DropDownStyle属性的默认值为另一个值(ComboBoxStyle.DropDownList),而不是基类中指定的默认值(ComboBoxStyle.DropDown)。

有人可能会认为你可以添加构造函数:

public CustomComboBox()
{
     this.DropDownStyle = ComboBoxStyle.DropDownList;
}
然而,这种方法会使Visual Studio Designer混淆。在Visual Studio中设计自定义控件时,如果您选择ComboBoxStyle.DropDown作为DropDownStyle,则它会认为您选择的属性仍然是默认值(来自基础ComboBox类中的[DefaultValue()]),因此它不会将customComboBox.DropDownStyle = ComboBoxStyle.DropDown行添加到Designer.cs文件中。令人困惑的是,您发现屏幕在运行时无法按预期工作。
由于DropDownStyle属性不是虚拟的,因此您无法覆盖它,但您可以执行以下操作:
[DefaultValue(typeof(ComboBoxStyle), "DropDownList")]
public new ComboBoxStyle DropDownStyle
{
      set { base.DropDownStyle = value; }
      get { return base.DropDownStyle; }
}

但是,使用“new”声明时会遇到一些微妙的问题。我已经尝试过这种方法,但好像并不起作用,因为Visual Studio设计器也会从这种方法中感到困惑,并强制使用ComboBoxStyle.DropDown(基类的默认设置)。

有其他的解决方法吗?抱歉问题描述较为冗长,很难详细说明。

1个回答

10

看起来这个运行正常:

public class CustomComboBox : ComboBox
{
    public CustomComboBox()
    {
        base.DropDownStyle = ComboBoxStyle.DropDownList;
    }

    [DefaultValue(ComboBoxStyle.DropDownList)]
    public new ComboBoxStyle DropDownStyle
    {
        set { base.DropDownStyle = value; Invalidate(); }
        get { return base.DropDownStyle;}
    }
}

8
可惜的是,没有一种方法可以在不重新实现属性的情况下添加属性。 - Pondidum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接