1

私は次のようなことができるようにしたいと思います:

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

だけでなく、次のこともできます。

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

私が最終的に思いついた回答コード:

[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
{
}
4

1 に答える 1

1

ParseChildren 属性は、コントロールの子をプロパティとして扱うかコントロールとして扱うかを .NET に指示します。最初の例では、子供をコントロールとして扱いたいので、追加します

[ ParseChildren(ChildrenAsProperties = false) ]

2 つ目は、ChildrenAsProperties=true であり、ITemplate 型の TabTemplate プロパティが必要です。その後、この MSDN サンプルで説明されているいくつかの配管が必要です。ただし、必要なテンプレートが 1 つだけの場合は、あまり価値がありません。

于 2009-03-05T21:37:30.720 に答える