Пользовательский элемент управления со свойством пользовательской коллекции - PullRequest
0 голосов
/ 11 июля 2011

У меня есть пользовательский элемент управления ASPX, который должен загружать свои свойства во внутреннюю коллекцию (определенную с помощью PersistenceMode.InnerProperty). Вот ASPX

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

Проблема в том, что когда я использую приведенный выше код, я получаю ошибку синтаксического анализатора "Тип 'CustomControls.QueryCollection' не имеет открытого свойства с именем 'QueryTypeOne'". (FYI QueryTypeOne наследует класс с именем Query). Я не хочу открытое свойство QueryTypeOne, я хочу, чтобы оно загружалось в свойство QueryCollection, которое я жду его!


Вот весь соответствующий код.

CustomControls.CustomControl класс имеет свойство под названием запросы

<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 Ответ

2 голосов
/ 14 июля 2011

Microsoft не реализует поддержку универсального списка для настраиваемых свойств коллекции элементов управления! Как только я добавил интерфейс IList, все стало работать точно так, как ожидалось.

Лично я не понимаю, почему они это сделали. Более того, я бы подумал, что IList(Of T) (IList<T> для вас, ребята из C #) должны работать автоматически везде, где требуется IList. В конце концов, T будет всегда наследоваться от объекта.

...