.net 将非集合对象用作数据源

.net 将非集合对象用作数据源,.net,data-binding,bindingsource,.net,Data Binding,Bindingsource,一组dotnetframework组件使用一个数据源组件。 我有一个对象,它有许多设置,可以修改它所表示的数据源。我想将此对象设置为一组ComboBox和DataGridViewComboBoxCells的下拉数据源 我的问题是当我试图把东西挂到组合框中时。我想,因为一旦设置了数据源,数据源的更改就可能发生,所以我必须使用这些BindingSource中的一种,但是MSDN文献正在恶作剧地告诉我BindingSource是什么,而不告诉我它的功能或工作方式 你们能建议的将这个对象作为数据源/绑定

一组dotnetframework组件使用一个数据源组件。 我有一个对象,它有许多设置,可以修改它所表示的数据源。我想将此对象设置为一组ComboBox和DataGridViewComboBoxCells的下拉数据源

我的问题是当我试图把东西挂到组合框中时。我想,因为一旦设置了数据源,数据源的更改就可能发生,所以我必须使用这些BindingSource中的一种,但是MSDN文献正在恶作剧地告诉我BindingSource是什么,而不告诉我它的功能或工作方式

你们能建议的将这个对象作为数据源/绑定源连接起来的最佳方式是什么

编辑:
显然,这个类是垃圾类,但它说明了我现在拥有的对象类型。
目前大部分时间都还没有确定,但基本上这表明我的类本身不是一个集合,而是包含一个集合。我需要能够指示ComboBox的DataSource属性在这里找到一个易失性列表,并且它应该使用该列表作为下拉列表的数据源

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

短版本:使用
BindingList

长版本:

数据源
通常是:

  • 单个对象(用于简单绑定)
  • 列表源(
    IListSource
  • 列表(
    IList
由于您将其用于下拉列表,因此听起来您需要后两个中的一个,通常是
IList
IListSource
相对较少,除了
DataTable

对于绑定后的更改,需要通知。对于简单绑定(单个对象),无论是
INotifyPropertyChanged
还是
*Changed
事件都是可行的-但是对于列表,您需要实现
IBindingList
并引发
ListChanged
事件来告诉控件发生了什么

老实说,这是很多很容易弄糟的无趣工作

实用的方法是使用
BindingList
(可能继承自它)。这将为您提供所有列表通知,包括支持列表中的项目,如果您在项目上实现
INotifyPropertyChanged
(但不支持
*Changed
事件),则列表将发生更改


警告:并非所有控件都关心通知。。。如果他们不这么做,你也无能为力。因此,如果即使在使用
BindingList
时也看不到添加/交换/etc-或者在实现
INotifyPropertyChanged
时看不到项目更新,那么。。。呃,难吗?

一些示例代码会很好:)我本来认为它足够清楚,但我想那是因为我已经知道问题出在哪里了。;)我会把一些东西放在一起。啊,iBindingList存在于System.ComponentModel中,我没有直接连接到Intellisense。我已经看过了iBindingSource,它看起来仍然不可理解,可能与我正在寻找的完全无关。iBindingList是一个必须填写的非常好的实现,但它更像是我想要的。非常感谢。但有一件事,我不认为有一个iBindingEnumerable或类似的?我可能只是在我的iBindingList实现中有很多不活动的函数,这样人们就不能添加东西了,但是如果没有列表方法就好了……基本上没有。ASP.NET可以处理
IEnumerable
,因为它只读取一次,但其他所有内容都希望能够多次获取数据,因此它使用IList上的索引器。更糟糕的是,您可能必须实现ITypedList-p(包括编写自己的PropertyDescriptor…)顺便说一句,IBindingList是除了实现(非通用)IList接口之外的另一个功能…哦,的确如此。VB为我输入了所有的方法声明,所以我没有注意到,但你是对的;iBindingList强制实现iList和iEnumerable。很遗憾没有iBindingList,但由于我不打算在列表操作函数的实现中添加任何代码,这是一个没有实际意义的问题。