Itemplate属性不可用作属性

时间:2010-09-10 19:30:06

标签: c# asp.net telerik custom-controls itemplate

我在Telerik的RadGrid控件中添加了一个ITemplate,名为SearchMenuTemplate ala:

    public class AbsRadGrid : RadGrid
{

    private ITemplate _ItemTemplate;
    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateContainer(typeof(searchBar))]
    public ITemplate SearchMenuTemplate
    {
        get { return _ItemTemplate; }// get
        set { _ItemTemplate = value; }// set
    }
}

Template类看起来像(为简洁起见,省略了createchildcontrol等强制覆盖方法):

[ParseChildren(true)]
class searchBar : CompositeControl, INamingContainer
{
    public string rbStartsWithText { get; set; }
}

现在,在源控件窗口中,RadGrid控件可以看到模板。但是rbStartsWithText不是节点上的属性。

我希望看到类似的内容(注意:在标记中注册了abs前缀):

    <abs:AbsRadGrid ID="rg" runat="server">
    <SearchMenuTemplate rbStartsWithText="Starts With" />
</abs:AbsRadGrid>

相反,rbStartsWithText会抛出一个绿色的波浪形,告诉我它不是SearchMenuTemplate的有效属性。

1 个答案:

答案 0 :(得分:0)

您的SearchMenuTemplate媒体资源属于ITemplate,但没有公共媒体资源,因此IntelliSense无法为您的<SearchMenuTemplate>代码提供任何属性。

为了能够添加自定义属性,您应该实现ITemplate接口(InstantiateIn方法)并在那里添加所需的属性:

public class YourCustomTemplate : ITemplate
{
    public string rbStartsWithText { get; set; }

    public void InstantiateIn(Control container)
    {
        HtmlGenericControl div = new HtmlGenericControl("div");
        div.InnerText = rbStartsWithText;
        container.Controls.Add(div);
    }
}

然后你可以使用你的自定义网格:

public class AbsRadGrid : RadGrid
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public YourCustomTemplate  SearchMenuTemplate { get; set; }
}

最后:

<abs:AbsRadGrid ID="rg" runat="server">
    <SearchMenuTemplate rbStartsWithText="Starts With" />
</abs:AbsRadGrid>