C# 将自定义对象列表数据绑定到ComboBox集合

C# 将自定义对象列表数据绑定到ComboBox集合,c#,winforms,C#,Winforms,我正在从事一个项目,该项目通过USB控制多个设备,并从Windows截取WM_DEVICECHANGE事件,以管理当前连接的设备和使用这些设备的插件模块。主窗体上存在一个组合框,它(应该)显示所有可用设备(自定义对象),并在设备到达或删除时动态更新 现在,我阅读的每个教程(包括这里的一些教程)都指示我将combobox的DataSource属性设置为我拥有的对象列表,并将DisplayMember/ValueMember属性留空以显示ToString()并将对象作为值返回 在我尝试过的某些情况下

我正在从事一个项目,该项目通过USB控制多个设备,并从Windows截取WM_DEVICECHANGE事件,以管理当前连接的设备和使用这些设备的插件模块。主窗体上存在一个组合框,它(应该)显示所有可用设备(自定义对象),并在设备到达或删除时动态更新

现在,我阅读的每个教程(包括这里的一些教程)都指示我将combobox的DataSource属性设置为我拥有的对象列表,并将DisplayMember/ValueMember属性留空以显示ToString()并将对象作为值返回

在我尝试过的某些情况下(例如,对列表进行后实例化并用示例/真实对象填充列表),combobox会填充,但是在移除或到达时,combobox中的集合不会更新,即使在每次设备到达/移除方法后将列表重新分配给combobox的DataSource属性

编辑:哦,对了。。。问题是

如何动态绑定(作为值返回的自定义对象)集合,使其能够处理列表内容的突然更改(添加/删除)?

编辑2:很抱歉,我没有说得更清楚,我不知道WPF有多么普及,但这是一个WinForms项目

提前感谢您提供的任何帮助。:)

即使将列表重新分配给 之后的combobox的DataSource属性 每个设备到达/移除方法

重新分配后,需要再次调用
.DataBind()


如果您使用的是.net 3.5或更高版本,则可以使用自动更新列表。

我不确定您使用的是WinForms还是WPF。我假设现在没有人应该从WinForms开始使用WPF


您需要将列表更改为ObservableCollection

WPF绑定模型在很大程度上依赖于精灵和术士的魔法子系统(不是嘲笑你,我是认真的)。他们有自己的语言来通知对方DataContext和UI之间发生了变化。这些主要是DependencyObject/Dependency属性、INotifyPropertyChanged和INotifyCollectionChanged以及ObservableCollection


通过正确使用这些图腾,ViewModels/Models(您粘贴在DataContext和/或绑定到数据源的内容)中的更改将反映在UI上。

我不知道ToString()位。我总是将DisplayMember设置为要显示的属性。我不关心ValueMember,因为SelectedItem是我的对象

如果这是一个WinForms项目,则DataBind不适用,听起来像。(USB等)

在我的项目中,当我更新组合框中的数据时,我不会做任何奇怪的事情,我只是再次设置数据源

编辑: 您可以尝试使用BindingList,而不是List。

不幸的是,我现在使用的是WinForms,因为我签订了一份短期合同(<4个月),而且我所在的公司并不真正需要WPF附带的功能和向前兼容性。尽管他们表示有兴趣在将来更具前瞻性,但就目前而言,该项目必须使用WinForms完成,然后可能在未来的修订中缓慢转换。这是一个简单的应用程序,所以我不明白为什么不能。