Пользовательские свойства пользовательского элемента управления теряют состояние при перестройке пользовательского элемента управления
У меня есть пользовательский элемент управления с настраиваемыми свойствами следующим образом:
[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 сериализуемым, но описанный выше подход реализовать было быстрее.
Может, это кому-то поможет. Саша