Изменение значения DefaultValue свойства в унаследованном элементе управления .net

В .net у меня есть унаследованный элемент управления:

public CustomComboBox : ComboBox

Я просто хочу изменить значение свойства DropDownStyle по умолчанию на другое значение (ComboBoxStyle.DropDownList), кроме значения по умолчанию, указанного в базовом классе (ComboBoxStyle.DropDown).

Можно подумать, что вы можете просто добавить конструктор:

public CustomComboBox()
{
     this.DropDownStyle = ComboBoxStyle.DropDownList;
}

Однако этот подход смущает Visual Studio Designer. При разработке пользовательского элемента управления в Visual Studio, если вы выберите ComboBoxStyle.DropDown для DropDownStyle, он считает, что выбранное вами свойство по-прежнему является значением по умолчанию (из [DevaultValue()] в базовом классе ComboBox), поэтому он не добавьте строку customComboBox.DropDownStyle = ComboBoxStyle.DropDown в файл Designer.cs. И достаточно смутно, вы обнаружите, что экран не ведет себя так, как только вы когда-то побежали.

Ну, вы не можете переопределить свойство DropDownStyle, так как оно не является виртуальным, но вы можете сделать:

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

но тогда вы столкнетесь с неприятностями из-за нюансов использования "новых" объявлений. Я пробовал это, и он, похоже, не работает правильно, поскольку дизайнер визуальной студии тоже путается с этим подходом и заставляет ComboBoxStyle.DropDown(по умолчанию для базового класса).

Есть ли другой способ сделать это? Извините за подробный вопрос, его сложно описать подробно.

Ответ 1

Похоже, что он работает:

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;}
    }
}