自定义控件与自定义集合属性

时间:2011-07-11 14:42:47

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

我有一个ASPX自定义控件,它应该将它的属性加载到内部集合中(使用PersistenceMode.InnerProperty定义)。这是ASPX

<cc:CustomControl runat="server">
    <Queries>
        <cc:QueryTypeOne ... />
    </Queries>
</cc:CustomControl>

问题是,当我使用上面的代码时,我得到一个解析器错误“Type'CustomControls.QueryCollection'没有名为'QueryTypeOne'的公共属性”。 (FYI QueryTypeOne继承了一个名为Query的类)。我不想要一个名为QueryTypeOne的公共属性,我希望它加载到我等待它的QueryCollection属性中!


以下是所有相关代码。

CustomControls.CustomControl类有一个名为queries

的属性
<DefaultValue(CType(Nothing, String)),
     MergableProperty(False),
     PersistenceMode(PersistenceMode.InnerProperty)> _
    Public Property Queries As QueriesContainerTag

QueriesContainerTag只是存在以允许ASPX引擎访问集合(QueryCollection)

<ParseChildren(True, "Queries"),
 Serializable()> _
Public Class QueriesContainerTag
    Private _Queries As QueryCollection = Nothing
    Public ReadOnly Property Queries As QueryCollection
        Get
            If _Queries Is Nothing Then
                _Queries = New QueryCollection()
            End If

            Return _Queries
        End Get
    End Property
End Class

其中QueryCollection是一个使用此签名实现ICollection的自定义类:

Public Class QueryCollection
    Implements IList(Of Query), ICollection(Of Query), IEnumerable(Of Query)

另外,奇怪的是,如果我将QueriesContainerTag更改为使用内置列表类,那么一切都很完美!

<ParseChildren(True, "Queries"),
 Serializable()> _
Public Class QueriesContainerTag
    Private _Queries As List(Of Query) = Nothing
    Public ReadOnly Property Queries As List(Of Query)
        Get
            If _Queries Is Nothing Then
                _Queries = New List(Of Query)()
            End If

            Return _Queries
        End Get
    End Property
End Class

1 个答案:

答案 0 :(得分:2)

Microsoft 为自定义控件集合属性实现Generic List支持!一旦我添加了IList接口,一切都开始完全按预期工作。

就个人而言,我不明白为什么他们这样做。更重要的是,我认为IList(Of T)IList<T>对你来说是C#伙伴们)应该在需要IList的任何地方自动运行。毕竟,T 总是从对象继承。