UserControl Комбинированные ListItems & ContentTemplate - PullRequest
1 голос
/ 22 января 2010

Можно ли создать UserControl, который принимает и ListItems, и ContentTemplate? Примерно так:

<Custom:UserControl ID="ucTest" runat="server">
  <Items>
    <asp:ListItem Text="Test1" Value="1" />
    <asp:ListItem Text="Test2" Value="2" />
  </Items>
  <ContentTemplate>
    Here is some content!<br/>
    <asp:Button ID="btnTest" runat="server" OnClick="SomeFunc" />
   </ContentTemplate>
</Custom:UserControl>

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Я скомбинировал их примерно так, и похоже, что они работают правильно:

   [ParseChildren(true), PersistChildren(false)]
    public class Test : WebControl, INamingContainer
    {
        [ParseChildren(true, "Items")]
        public class iTestItems
        {
            private ListItemCollection _Items;

            [DefaultValue((string)null), MergableProperty(false), PersistenceMode(PersistenceMode.InnerDefaultProperty)]
            public virtual ListItemCollection Items
            {
                get
                {
                    if (_Items == null)
                        _Items = new ListItemCollection();

                    return _Items;
                }
            }
        }

        private iTestItems _TestItems = null;
        private ITemplate _ContentTemplate = null;
        public event EventHandler TestClick = null;

        [PersistenceMode(PersistenceMode.InnerProperty),
         TemplateContainer(typeof(iTestItems)),
         TemplateInstance(TemplateInstance.Single)]
        public iTestItems TestItems
        {
            get { return _TestItems; }
            set { _TestItems = value; }
        }

        [PersistenceMode(PersistenceMode.InnerProperty),
         TemplateContainer(typeof(TemplateControl)),
         TemplateInstance(TemplateInstance.Single)]
        public ITemplate ContentTemplate
        {
            get { return _ContentTemplate; }
            set { _ContentTemplate = value; }
        }

    }

Используется:

<cc:Test ID="jqTestTest01" runat="server" OnTestClick="jqTestTest01_TestClick">
    <TestItems>
        <asp:ListItem Text="Tab One" Value="1" Selected="True" />
        <asp:ListItem Text="Tab Two" Value="2" />
        <asp:ListItem Text="Tab Three" Value="3" />
        <asp:ListItem Text="Tab Four" Value="4" />
        <asp:ListItem Text="Tab Five" Value="5" />
    </TestItems>
    <ContentTemplate>
        <asp:Label ID="lblTestTest01" runat="server" Text="None" />            
    </ContentTemplate>    
</cc:Test>
1 голос
/ 23 января 2010

В этом примере показано, как настроить пользовательский элемент управления, чтобы иметь несколько дочерних элементов по вашему желанию: http://www.codeproject.com/KB/webforms/MikEllASPNetQuery.aspx. Я опубликовал пример пользовательского элемента управления, потому что я почти уверен, что вы не можете использовать пользовательский элемент управления.

contenttemplate может быть свойством ITemplate с getter / setter, в то время как другой, возможно, вы могли бы воспользоваться классом ListItemCollection. Определите каждое свойство, как определено в статье (это пример с несколькими ссылками на внутренние объекты).

НТН.

...