将List 连接到ListBox并查看ListBox中数据源的更改
我希望当我删除或添加一个对象到我用作其DataSource
的列表时, ListBox
自动显示更改。
如何将List
连接到ListBox
并立即查看ListBox
中基础列表的更改?
在Windows Forms
,在想要查看绑定列表控件中数据源更改的场景中,如ComboBox
, ListBox
或DataGridView
(复杂的双向数据绑定),您应该使用实现IBindingList
接口的类作为DataSource
捆绑。 最合适的实现是BindingList
。 这样,控件的基础数据源中的每个添加/删除都将立即在控件中可见。
请记住,使用BindingList
允许绑定控件看到添加或删除的项目,但是为了立即查看属性更改, T
应该实现INotifyPropertyChanged
。 这样,您的控件将通知PropertyChanged
并始终显示新数据。
注1 – ObservableCollection是否解决了双向数据绑定Probelm?
在Windows窗体中,一个常见的错误是使用ObservableCollection
,它不适用于此要求,因为它不实现IBindingList
。
注2 – BindingSource是否解决了双向数据绑定问题?
如果BindingSource
的底层数据源没有实现IBindingList
则它不能解决双向数据绑定问题。 您需要通知控件从绑定源重新加载数据,因此您可以调用BindingSource
ResetBindings
方法。 这样,绑定控件将从数据源重新加载数据并显示最新数据:
this.bindingSource1.ResetBindings(false);
注3 – 我应该使用List
。 如何使用List
解决问题?
如果必须使用List
,则可以在需要时重置列表框的数据绑定,例如,在每次更改后,应将其DataSource
分配为null并再次分配给DataSource
列表:
this.listBox1.DataSource = null; this.listBox1.DataSource = list;
请参阅以下示例,其中将字符串List传递到listBox实例。
public partial class Form1 : Form { List _items = new List (); // <-- Add this public Form1() { InitializeComponent(); _items.Add("One"); // <-- Add these _items.Add("Two"); _items.Add("Three"); listBox1.DataSource = _items; } }