用户控件中设计时可分配的集合类型属性

时间:2012-03-08 19:14:35

标签: asp.net .net vb.net user-controls

我正在创建一个用户控件,其中有一个名为Items的属性。 Items的类型为LibraryPanelBarItemCollection(自定义类),其中包含LibraryPanelBarItem对象的集合。我希望能够在设计时使用VS用于添加诸如treenodes / listviewitems之类的东西的Collection编辑器来添加它们。理想情况下,我也可以声明性地将它们添加到html语法中。我可以显示Items属性,但是我没有智能感知来在开始标记和结束标记之间添加项目。

在我的用户控件中,我使用属性

声明了以下属性
 <ParseChildren(True, "Items")> _
 Public Class LibraryPanelBar
Inherits System.Web.UI.UserControl

<PersistenceMode(PersistenceMode.InnerDefaultProperty)> _
<Browsable(True)> _
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Property Items As LibraryPanelBarItemCollection

...Do Some Stuff...

End Class

以下是LibraryPanelBarItem和LibraryPanelBarItemCollection的自定义类

Public Class LibraryPanelBarItem
<BindableAttribute(True)> _
Public Property ImageUrl As String

<BindableAttribute(True)> _
Public Property NavigateUrl As String
Public Property Text As String
Public Property Disabled As Boolean
Public Property ID As String
<PersistenceMode(PersistenceMode.InnerDefaultProperty)> _
Public Property Items As LibraryPanelBarItemCollection
Public ReadOnly Property HasChildren() As Boolean
    Get
        If Items.Count > 0 Then
            Return True
        Else
            Return False
        End If
    End Get
End Property


Public Sub New()
    Items = New LibraryPanelBarItemCollection
End Sub
End Class

Public Class LibraryPanelBarItemCollection
Inherits CollectionBase

Default Public ReadOnly Property Item(Index As Integer) As LibraryPanelBarItem
    Get
        Return DirectCast(List(Index), LibraryPanelBarItem)
    End Get
End Property

Public Function Contains(itemType As LibraryPanelBarItem) As Boolean
    Return List.Contains(itemType)
End Function

Public Function Add(itemType As LibraryPanelBarItem) As Integer
    Return List.Add(itemType)
End Function

Public Sub Remove(itemType As LibraryPanelBarItem)
    List.Remove(itemType)
End Sub

Public Sub Insert(index As Integer, itemType As LibraryPanelBarItem)
    List.Insert(index, itemType)
End Sub

Public Function IndexOf(itemType As LibraryPanelBarItem) As Integer
    Return List.IndexOf(itemType)
End Function

Public Sub New()

End Sub
End Class

这是我在aspx文件中的当前声明:

 <uc1:LibraryPanelBar ID="LibraryPanelBar2" runat="server">
     <Items>
     </Items>
 </uc1:LibraryPanelBar>

1 个答案:

答案 0 :(得分:0)

以下内容应指向正确的方向。如果您需要任何进一步的细节,请随时发表评论。

<ToolboxData("<{0}:LibraryPanelBar runat=""server""> </{0}:LibraryPanelBar>")>
Public Class LibraryPanelBar
    Inherits HierarchicalDataBoundControl

    Private _Items As New LibraryPanelBarItemCollection()

    <PersistenceMode(PersistenceMode.InnerProperty)> _
    <MergableProperty(False)> _
    <Editor("WebApplicationVB1.TreeNodeCollectionEditor,WebApplicationVB1", GetType(UITypeEditor))> _
    Public ReadOnly Property Items As LibraryPanelBarItemCollection
        Get
            Return _Items
        End Get
    End Property

    Protected Overrides Sub PerformSelect()

    End Sub

    Protected Overrides Sub ValidateDataSource(dataSource As Object)

    End Sub

    Protected Overrides Sub RenderContents(writer As System.Web.UI.HtmlTextWriter)
        writer.RenderBeginTag(HtmlTextWriterTag.Ul)
        For Each item As LibraryPanelBarItem In Items
            writer.RenderBeginTag(HtmlTextWriterTag.Li)
            RenderContentsRecursive(writer, item)
            writer.RenderEndTag() ' Li
        Next
        writer.RenderEndTag() ' Ul
    End Sub
    Private Sub RenderContentsRecursive(writer As System.Web.UI.HtmlTextWriter, item As LibraryPanelBarItem)
        writer.Write(item.Text)
        writer.WriteBreak()
        writer.RenderBeginTag(HtmlTextWriterTag.Ul)
        For Each subItem As LibraryPanelBarItem In item.Items
            writer.RenderBeginTag(HtmlTextWriterTag.Li)
            RenderContentsRecursive(writer, subItem)
            writer.RenderEndTag() ' Li
        Next
        writer.RenderEndTag() ' Ul
    End Sub
End Class

<ParseChildren(True, "Items")> _
Public Class LibraryPanelBarItem
    Implements IStateManager, ICloneable

    Private _Items As New LibraryPanelBarItemCollection()

    <BindableAttribute(True)> _
    Public Property ImageUrl As String

    <BindableAttribute(True)> _
    Public Property NavigateUrl As String
    Public Property Text As String
    Public Property Disabled As Boolean
    <Browsable(False)> _
<PersistenceMode(PersistenceMode.InnerDefaultProperty)> _
    Public ReadOnly Property Items As LibraryPanelBarItemCollection
        Get
            Return _Items
        End Get
    End Property
    Public ReadOnly Property HasChildren() As Boolean
        Get
            If Items.Count > 0 Then
                Return True
            Else
                Return False
            End If
        End Get
    End Property

    Public ReadOnly Property IsTrackingViewState As Boolean Implements System.Web.UI.IStateManager.IsTrackingViewState
        Get
            Throw New NotImplementedException()
        End Get
    End Property

    Public Sub LoadViewState(state As Object) Implements System.Web.UI.IStateManager.LoadViewState
        Throw New NotImplementedException()
    End Sub

    Public Function SaveViewState() As Object Implements System.Web.UI.IStateManager.SaveViewState
        Throw New NotImplementedException()
    End Function

    Public Sub TrackViewState() Implements System.Web.UI.IStateManager.TrackViewState
        Throw New NotImplementedException()
    End Sub

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Throw New NotImplementedException()
    End Function
End Class

Public Class LibraryPanelBarItemCollection
    Inherits CollectionBase
    Implements IStateManager

    Default Public ReadOnly Property Item(Index As Integer) As LibraryPanelBarItem
        Get
            Return DirectCast(List(Index), LibraryPanelBarItem)
        End Get
    End Property

    Public Function Contains(itemType As LibraryPanelBarItem) As Boolean
        Return List.Contains(itemType)
    End Function

    Public Function Add(itemType As LibraryPanelBarItem) As Integer
        Return List.Add(itemType)
    End Function

    Public Sub Remove(itemType As LibraryPanelBarItem)
        List.Remove(itemType)
    End Sub

    Public Sub Insert(index As Integer, itemType As LibraryPanelBarItem)
        List.Insert(index, itemType)
    End Sub

    Public Function IndexOf(itemType As LibraryPanelBarItem) As Integer
        Return List.IndexOf(itemType)
    End Function

    Public ReadOnly Property IsTrackingViewState As Boolean Implements System.Web.UI.IStateManager.IsTrackingViewState
        Get
            Throw New NotImplementedException()
        End Get
    End Property

    Public Sub LoadViewState(state As Object) Implements System.Web.UI.IStateManager.LoadViewState
        Throw New NotImplementedException()
    End Sub

    Public Function SaveViewState() As Object Implements System.Web.UI.IStateManager.SaveViewState
        Throw New NotImplementedException()
    End Function

    Public Sub TrackViewState() Implements System.Web.UI.IStateManager.TrackViewState
        Throw New NotImplementedException()
    End Sub
End Class

Public Class LibraryPanelBarItemCollectionEditor
    Inherits System.Drawing.Design.UITypeEditor

    Public Overrides Function EditValue(context As System.ComponentModel.ITypeDescriptorContext, provider As System.IServiceProvider, value As Object) As Object
        Return MyBase.EditValue(context, provider, value)
    End Function

    Public Overrides Function GetEditStyle(context As System.ComponentModel.ITypeDescriptorContext) As System.Drawing.Design.UITypeEditorEditStyle
        Return MyBase.GetEditStyle(context)
    End Function

End Class

编辑:添加了UI集合编辑器示例。