c# - Enlace de datos a la lista: vea los cambios del origen de datos en ListBox, ComboBox
winforms data-binding (2)
Quiero que
ListBox
muestre cambios automáticamente cuando elimine o agregue un objeto a la lista que uso como
DataSource
.
¿Cómo puedo conectar una
List<T>
a un
ListBox
y ver los cambios de la lista subyacente en
ListBox
inmediato?
Consulte el siguiente ejemplo donde se pasa una Lista de cadenas a una instancia de 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;
}
}
En
Windows Forms
, en un escenario en el que desea ver los cambios del origen de datos en el control de lista enlazada, como
ComboBox
,
ListBox
o
DataGridView
(enlace de datos bidireccional complejo), debe usar una clase que implemente la interfaz
IBindingList
como
DataSource
de datos Unión.
La implementación más adecuada es
BindingList<T>
.
De esta manera, cada adición / eliminación en la fuente de datos subyacente de su control será visible en el control de inmediato.
Tenga en cuenta que el uso de
BindingList<T>
permite que el control vinculado vea los elementos agregados o eliminados, pero para ver también los cambios de propiedad de inmediato,
T
debe implementar
INotifyPropertyChanged
.
De esta manera, sus controles serán notificados de
PropertyChanged
y siempre mostrarán datos nuevos.
Nota 1: ¿ObservableCollection resuelve el problema de enlace de datos bidireccional?
En Windows Form, un error común es usar
ObservableCollection
que no funcionará para este requisito ya que no implementa
IBindingList
.
Nota 2: ¿BindingSource resuelve el problema de enlace de datos bidireccional?
Si la fuente de datos subyacente de
BindingSource
no implementa
IBindingList<T>
, no resuelve el problema de enlace de datos bidireccional.
ResetBindings
notificar a los controles para recargar los datos desde la fuente de enlace, para que pueda llamar
ResetBindings
método
BindingSource
de
BindingSource
.
De esta forma, los controles vinculados volverán a cargar los datos del origen de datos y mostrarán los datos más recientes:
this.bindingSource1.ResetBindings(false);
Nota 3 - Debería usar la
List<T>
.
¿Cómo puedo resolver el problema usando
List<T>
?
Si debe usar
List<T>
, puede restablecer el enlace de datos de su cuadro de lista cuando lo necesite, por ejemplo, después de cada cambio, debe asignar su
DataSource
a nulo y nuevamente a la lista de datos:
this.listBox1.DataSource = null;
this.listBox1.DataSource = list;