Пользовательские свойства пользовательского элемента управления теряют состояние при перестройке пользовательского элемента управления - PullRequest
3 голосов
/ 13 апреля 2011

У меня есть пользовательский элемент управления с пользовательскими свойствами следующим образом:

[DefaultValue(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Description("Gets or sets whether the \"Remove\" button is visible.")]
public bool ShowRemoveButton
{
    get
    {
        return this.removeButton.Visible;
    }
    set
    {
        this.removeButton.Visible = value;
    }
}

Элемент управления содержит стандартный элемент управления кнопки.Это свойство используется для отображения или скрытия кнопки.Пользовательский элемент управления встроен в отдельную сборку проекта.Я поместил его в форму, и я могу установить и сбросить вышеуказанное свойство, и все, кажется, работает просто отлично.Однако когда проект, содержащий пользовательский элемент управления, перестраивается, значение свойства изменяется на «ложь», что не является значением по умолчанию.

Как можно предотвратить потерю / изменение пользовательского свойства своего состояния, когда элемент управленияперестроен

Ответы [ 2 ]

4 голосов
/ 13 апреля 2011

Проблема в том, что DefaultValueAttribute только сообщает конструктору , какое значение по умолчанию для свойства.Он контролирует, отображается ли свойство в полужирном , и к чему возвращается значение, когда вы щелкаете правой кнопкой мыши по свойству и выбираете «Сброс» в контекстном меню.

Что это not do - установить свойство для определенного значения во время выполнения.Для этого вам нужно поместить код в метод конструктора вашего пользовательского элемента управления.Например:

// set default visibility
this.removeButton.Visible = true;

В противном случае, как вы описали, значение свойства будет сброшено при перестройке проекта.Он будет отображаться в полужирном в окне «Свойства» конструктора, поскольку он не соответствует значению по умолчанию (как указано в DefaultValueAttribute), но этот атрибут не меняет установленное значениек.

2 голосов
/ 12 июля 2014

Простой способ предотвратить сброс свойств любых содержащихся в нем элементов управления при (де) сериализации связанных свойств - это использовать частное вспомогательное поле для свойства и назначить значение по умолчанию, соответствующее параметру атрибута DefaultValue.В данном случае это _showRemoveButton = true объявление / назначение ниже.

[DefaultValue(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Description("Gets or sets whether the \"Remove\" button is visible.")]
public bool ShowRemoveButton
{
    get
    {
        return _showRemoveButton;
    }
    set
    {
        _showRemoveButton = value;
        this.removeButton.Visible = value;
    }
}
private bool _showRemoveButton = true;
...