Свойство типа коллекции, назначаемое во время разработки в пользовательском элементе управления - PullRequest
2 голосов
/ 08 марта 2012

Я создаю пользовательский элемент управления, в котором у меня есть свойство Items. Элементы имеют тип LibraryPanelBarItemCollection (пользовательский класс), который содержит коллекцию объектов LibraryPanelBarItem. Я хотел бы иметь возможность добавлять их во время разработки с помощью редактора Collection, который VS использует для добавления таких вещей, как treenodes / listviewitems. В идеале я также смог бы декларативно добавить их в синтаксис 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 голосов
/ 13 марта 2012

Следующее должно указать вам в правильном направлении.Не стесняйтесь комментировать, если вам нужна дополнительная информация.

<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

РЕДАКТИРОВАНИЕ: Добавлен пример редактора коллекции пользовательского интерфейса.

...