c# winforms list data-binding listbox

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;