1

Ich möchte in der Lage sein, etwas zu tun wie:Möglich, ein inneres Steuerelement auf einem benutzerdefinierten Serversteuerelement zu haben?

<ui:Tab Title="A nice title"> 
    <TabTemplate> 
    <asp:Literal runat="server" ID="SetMe">With Text or Something</asp:Literal> 
    </TabTemplate> 
</ui:Tab> 

sondern auch die Lage zu tun:

<ui:Tab Title="A nice title"> 
    <TabTemplate> 
    <asp:DataList runat="server" ID="BindMe"></asp:DataList> 
    </TabTemplate> 
</ui:Tab> 

Antwort Code Ich kam schließlich nach oben mit:

[ParseChildren(true)] 
public class Node : SiteMapNodeBaseControl, INamingContainer 
{ 
    private ITemplate tabTemplate; 
    [Browsable(false), 
    DefaultValue(null), 
    Description("The tab template."), 
    PersistenceMode(PersistenceMode.InnerProperty), 
    TemplateContainer(typeof(TabTemplate))] 
    public ITemplate TabTemplate 
    { 
     get { return tabTemplate; } 
     set { tabTemplate = value; } 
    } 
    protected override void CreateChildControls() 
    { 
     if (TabTemplate != null) 
     { 
      Controls.Clear(); 
      TabTemplate i = new TabTemplate(); 
      TabTemplate.InstantiateIn(i); 
      Controls.Add(i); 
     } 
    } 
    protected override void Render(HtmlTextWriter writer) 
    { 
     EnsureChildControls(); 
     base.Render(writer); 
    } 
} 


public class TabTemplate : Control, INamingContainer 
{ 
} 

Antwort

1

Der Das ParseChildren-Attribut teilt .NET mit, ob die untergeordneten Elemente des Steuerelements als Eigenschaften oder als Steuerelemente behandelt werden sollen. Für Ihre erste Beispiel möchten Sie Kinder als Kontrollen behandeln, so

[ ParseChildren(ChildrenAsProperties = false) ] 

Für den zweiten hinzufügen, möchten Sie ChildrenAsProperties = true, und eine TabTemplate Eigenschaft des Typs ITemplate. Es gibt einige Klempnerarbeiten danach, die this MSDN sample beschreibt. Es bringt jedoch keinen großen Mehrwert, wenn Sie nur eine Vorlage benötigen.

+0

Ich habe eingefügt, was ich bisher habe. Fast ...: P – rball