Я пишу собственный составной WebControl и хочу представить стили дочерних элементов управления, которые он инкапсулирует, в конструкторе ASP.NET. Код, который у меня сейчас есть, похож на скелет ниже (который для простоты имеет только один дочерний элемент управления).
С помощью приведенного ниже кода я вижу свойство «ChildPanelStyle» в конструкторе, но когда я пытаюсь изменить одно из свойств (например, CssClass) в конструкторе, оно сразу же сбрасывает себя к значению по умолчанию. Похоже, что дизайнерская сериализация не происходит.
Что я делаю не так?
UPDATE
Добавление установщика для свойства style не помогает и не должно быть необходимым. Я обновил образец дополнительным свойством стиля, которое напрямую управляется пользовательским элементом управления, а не просто является свойством дочернего элемента управления.
Свойство HeaderStyle правильно сохраняется конструктором, а свойство ChildPanelStyle - нет.
Конечно, я мог бы управлять всеми своими стилями, такими как HeaderStyle, и применять их во время рендеринга, но я надеюсь, что есть более простое решение, при котором дочерние элементы управления могут позаботиться о себе, и мне не нужно никакого специального рендеринга. *
public class MyControl : CompositeControl
{
Panel myChildPanel;
protected override void CreateChildControls()
{
myChildPanel = new Panel();
this.Controls.Add(myChildPanel);
}
[
Category("Style"),
Description("Child panel style"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
]
public System.Web.UI.WebControls.Style ChildPanelStyle
{
get
{
EnsureChildControls();
return this.myChildPanel.ControlStyle;
}
}
[
Category("Style"),
Description("Header style"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
NotifyParentProperty(true),
PersistenceMode(PersistenceMode.InnerProperty),
]
public System.Web.UI.WebControls.Style HeaderStyle
{
get
{
if (_headerStyle == null)
{
_headerStyle = new Style();
if (IsTrackingViewState)
((IStateManager)_headerStyle).TrackViewState();
}
return _headerStyle;
}
}
private System.Web.UI.WebControls.Style _headerStyle;
// ... overrides for save/load/tracking ViewState omitted
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
EnsureChildControls();
base.Render(writer);
}
}