Пользовательские свойства пользовательского элемента управления теряют состояние при перестройке пользовательского элемента управления

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

[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 ответа

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

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

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

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

Простой способ предотвратить сброс свойств любых содержащихся в нем элементов управления при (де) сериализации связанных свойств - это использовать частное вспомогательное поле для свойства и назначить значение по умолчанию, соответствующее 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;

Старый пост, но он помог мне найти решение моей проблемы. Я произвел точно такой же эффект, что состояние моей собственности было потеряно при восстановлении. В моем случае свойство - это сам класс, который предоставляет кучу логических значений.

Для меня решение состояло в том, чтобы изменить поведение дизайнеров в отношении сериализации собственности.

   [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public SomePropertyClass SomeProperty
{
    get { return _SomeProperty; }
    set { _SomeProperty = Value; }
}

Используя DesignerSerializationVisibility.Content, вы указываете дизайнеру сериализовать содержимое класса свойства (мое логическое значение, содержащееся в SomePropertyClass), а не само свойство. Я предполагаю, что другой подход заключался бы в том, чтобы сделать SomePropertyClass сериализуемым, но описанный выше подход реализовать было быстрее.

Может, это кому-то поможет. Саша

Другие вопросы по тегам