Использование не коллекционного объекта в качестве источника данных

Куча компонентов каркаса dotnet использует компонент DataSource. У меня есть объект, который имеет ряд настроек, которые могут изменить источник данных, который он представляет. Я хотел бы установить этот объект в качестве раскрывающегося DataSource набора ComboBoxes и DataGridViewComboBoxCells.

Моя проблема возникает, когда я пытаюсь подключить устройство к ComboBox. Я предполагаю, что, поскольку изменения в DataSource могут произойти после того, как DataSource был установлен, я должен использовать одну из этих вещей BindingSource, но литература по MSDN не дает понять, что такое связывание Source, не рассказывая, что он делает или как это работает.

Как вы, ребята, могли бы посоветовать подключить этот Объект как DataSource / BindingSource?

РЕДАКТИРОВАТЬ:
Очевидно, этот класс нежелателен, но он иллюстрирует тот тип объекта, который у меня есть сейчас.
Большая часть времени находится в воздухе в данный момент, но в основном это показывает, что мой класс не сам сборник, а содержит его. Мне нужно иметь возможность указать свойству DataSource ComboBox, что здесь есть изменчивый список и что он должен использовать этот список в качестве источника данных для своего раскрывающегося списка.

<code>Public Class DynamicDataSource
    Private basicList As New List(Of String)(New String() {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"})
    Private _showEvensOnly As Boolean
    Private _showNotContainingO As Boolean
    Public Property ShowEvensOnly() As Boolean
        Get
            Return _showEvensOnly
        End Get
        Set(ByVal value As Boolean)
            _showEvensOnly = value
        End Set
    End Property
    Public Property ShowNotContainingO() As Boolean
        Get
            Return _showNotContainingO
        End Get
        Set(ByVal value As Boolean)
            _showNotContainingO = value
        End Set
    End Property
    Public Function GetDynamicList() As List(Of String)
        Dim processMe As New List(Of String)(basicList)
        If Me._showEvensOnly Then
            For JJ As Integer = processMe.Count - 1 To 0 Step -1
                If JJ Mod 2 = 0 Then
                    processMe.Remove(processMe(JJ))
                End If
            Next
        End If

        If Me._showNotContainingO Then
            For JJ As Integer = processMe.Count - 1 To 0 Step -1
                If processMe(JJ).ToUpper.Contains("O"c) Then
                    processMe.Remove(processMe(JJ))
                End If
            Next
        End If

        Return processMe
    End Function
End Class
</code>

Ответы на вопрос(1)

BindingList<T>...

Длинная версия:

DataSource обычно либо:

an individual object (for simple binding) a list source (IListSource) a list (IList)

Так как вы используете его для раскрывающегося списка, звучит так, как будто вы хотите один из вторых двух, как правило,IList (IListSource относительно редко, за исключениемDataTable).

Для изменений, как только вы связали, вам нужны уведомления. Для простых привязок (отдельных объектов), либоINotifyPropertyChanged или же*Changed события - это путь, но для списков нужно реализоватьIBindingList и поднятьListChanged событие, чтобы рассказать контролю, что произошло.

Честно говоря, это много неинтересной работы, из которой очень легко навести порядок.

Прагматичный подход заключается в работе сBindingList<T> (возможно наследование от него). Это дает вам все уведомления списка, в том числе поддержку предметовin список меняется, если вы реализуетеINotifyPropertyChanged на предметах (он не поддерживает*Changed события, хотя).

Предостережение: не все элементы управления заботятся об уведомлениях ... и если их не так уж много, вы можете с этим поделать. Поэтому, если вы не видите дополнений / свопов и т. Д. Даже при использованииBindingList<T> - или вы не видите обновления элемента при внедренииINotifyPropertyChangedтогда ... ээ, круто?

ВАШ ОТВЕТ НА ВОПРОС