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

1

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

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

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

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

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
Некоторый пример кода был бы хорош :) Josh
Я думал, что это достаточно ясно, но я думаю, это потому, что я уже знаю, в чем проблема. ;) Я что-нибудь скину вместе. Frosty840
(ответил на комментарий) Marc Gravell♦

Ваш Ответ

1   ответ
3

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тогда ... ээ, круто?

Нет, в основном. ASP.NET может обойтисьIEnumerable<>потому что он читается только один раз - но все остальное хочет иметь возможность получать данные несколько раз, поэтому он использует индексатор в IList.
кстати - IBindingList находится вaddition для реализации (не универсального) интерфейса IList ...
Может быть и хуже - вам, возможно, придется реализовать ITypedList ;-p (который включает в себя написание ваших собственных PropertyDescriptors ...)
О, так и есть. VB вставил для меня все объявления методов, так что я не заметил, но вы правы; iBindingList форсирует реализацию как iList, так и iEnumerable. Обидно, что нет iBindingList, но, поскольку я не собираюсь помещать какой-либо код в мою реализацию функций манипулирования списком, это спорный вопрос. Frosty840
Ах, iBindingList живет в System.ComponentModel, который я не привязал напрямую к Intellisense. Я посмотрел на iBindingSource, который все еще выглядит непостижимым и, вероятно, совершенно не связан с тем, что я ищу. iBindingList - это чертова реализация, которую нужно заполнить, но этоmuch больше того, что я искал. Спасибо большое. Одна вещь, однако, я не предполагаю, что есть iBindingEnumerable или подобное? Я, вероятно, просто буду иметь много неактивных функций в моей реализации iBindingList, так что люди не смогут добавлять вещи, но было бы неплохо обойтись без методов списка ... Frosty840

Похожие вопросы