数据绑定到 List - 查看 ListBox、ComboBox 中数据源的变化
Posted
技术标签:
【中文标题】数据绑定到 List - 查看 ListBox、ComboBox 中数据源的变化【英文标题】:Databinding to List - See changes of data source in ListBox, ComboBox 【发布时间】:2016-02-10 23:26:02 【问题描述】:我希望ListBox
在我将对象删除或添加到我用作其DataSource
的列表中时自动显示更改。
如何将List<T>
连接到ListBox
并立即查看ListBox
中基础列表的变化?
【问题讨论】:
how to bind a list to a combobox? (Winforms)的可能重复 @Sayse 我认为问题不是该链接的重复 :) 该链接的重点是将List<T>
设置为 DataSource
但 OP 需要查看其列表中的更改ListBox
这意味着他应该使用IBindingList
或BindingList
的实现。
@RezaAghaei - 该问题中接受的答案提到了这一点,但是是的,它没有解释它。无论哪种方式,操作都不需要很长时间才能找到重复项...“winforms 数据绑定列表”将该重复项作为其第一个结果
@Sayse 感谢您的反馈,我认为我的回答对用户来说更直接。希望你也觉得它有用:)
@RezaAghaei - MSDN: Winforms Databinding 和 a second duplicate
【参考方案1】:
在Windows Forms
中,如果你想在绑定列表控件中看到数据源的变化,比如ComboBox
、ListBox
或DataGridView
(复杂的双向数据绑定),你应该使用一个实现IBindingList
接口作为数据绑定的DataSource
的类。最合适的实现是BindingList<T>
。这样,您的控件底层数据源中的每个添加/删除操作都将立即在控件中可见。
请记住,使用BindingList<T>
允许绑定控件查看添加或删除的项目,但也可以立即查看属性更改,T
应该实现INotifyPropertyChanged
。这样您的控件就会收到PropertyChanged
的通知并始终显示最新数据。
注 1 - ObservableCollection 是否解决双向数据绑定问题?
在 Windows 窗体中,一个常见的错误是使用 ObservableCollection
,因为它没有实现 IBindingList
,因此不适用于此要求。
注 2 - BindingSource 是否解决双向数据绑定问题?
如果BindingSource
的底层数据源没有实现IBindingList<T>
就不能解决双向数据绑定问题。您需要通知控件从绑定源重新加载数据,因此您可以调用BindingSource
的ResetBindings
方法。这样,绑定控件将从数据源重新加载数据并显示最新数据:
this.bindingSource1.ResetBindings(false);
注意 3 - 我应该使用 List<T>
。如何使用List<T>
解决问题?
如果您必须使用List<T>
,那么您可以在需要时重置列表框的数据绑定,例如在每次更改后您应该将其DataSource
分配为null,然后再次分配给数据列表:
this.listBox1.DataSource = null;
this.listBox1.DataSource = list;
【讨论】:
【参考方案2】:请参阅以下示例,其中将字符串列表传递到 listBox 实例。
public partial class Form1 : Form
List<string> _items = new List<string>(); // <-- Add this
public Form1()
InitializeComponent();
_items.Add("One"); // <-- Add these
_items.Add("Two");
_items.Add("Three");
listBox1.DataSource = _items;
【讨论】:
List<T>
不适用于需要查看数据源变化的情况。以上是关于数据绑定到 List - 查看 ListBox、ComboBox 中数据源的变化的主要内容,如果未能解决你的问题,请参考以下文章
绑定到 List<string> 时如何使 ListBox 可编辑?
在 WinForms 中将 Listbox 绑定到 List<object>
使用 SelectionMode = Multiple 对 ListBox 进行数据绑定
winform datagridview 绑定 list .c#