c# - una - Lista de enlaces<Double> a WinForms-Listbox
data binding c# español (6)
Tengo un problema pequeño (probablemente tonto) con enlace de datos. Intento unir una Lista
List<double> _measuredValues = new List<double>();
a un ListBox de winforms.
En Form_Load establecí:
lstMeasuredValues.DataSource = _measuredValues;
Cuando actualizo los valores, no aparece nada?
_measuredValues.Add(numBuffer);
Una cosa en la que pensé es un problema con el tipo de datos. ¿Pero cómo cambio el tipo solo para cambiarlo a una cadena?
lstMeasuredValues.DataSource = _measuredValues.ToString().ToList();
Otra razón podría ser que la línea superior del código está dentro de otro hilo. Pero creo que este no debería ser el problema.
¿Cómo puedo enlazar esta lista?
Cuando actualizo los valores, no aparece nada?
_measuredValues.Add (numBuffer);
Para permitir que la IU refleje las modificaciones de la fuente de datos, la fuente de datos debe proporcionar algún tipo de notificación de cambio. La infraestructura de enlace de datos de la lista WinForms usa el evento ListChanged de la interfaz IBindingList . Existe una clase BindingList <T> estándar que se puede usar en lugar de List<T>
para obtener el comportamiento deseado. Todo lo que necesitas es cambiar esta línea
List<double> _measuredValues = new List<double>();
a
BindingList<double> _measuredValues = new BindingList<double>();
Otra razón podría ser que la línea superior del código está dentro de otro hilo. Pero creo que este no debería ser el problema.
Eso no es bueno. Debe asegurarse de no hacer eso porque se espera que el evento ListChanged
se ListChanged
en el subproceso de UI.
El problema es que la List
común no es la elección correcta para el enlace de datos. Debería usar BindingList si desea mantener actualizado el ListBox.
Intenta usarlo de esta manera:
BindingList<double> bindList = new BindingList<double>(_measuredValues);
lstMeasuredValues.DataSource = bindList;
Tenga en cuenta que cuando agrega un nuevo elemento en _measuredValues, debe actualizar manualmente el enlace, como ahora, así:
bindList.ResetBindings();
La mejor manera es borrar los elementos y asignar nuevamente el DataSource:
lstMeasuredValues.Items.Clear()// clear all items
lstMeasuredValues.DataSource = _measuredValues;
O incluso puede definir su propia función de actualización y llamar de la siguiente manera:
public void RefreshList()
{
lstMeasuredValues.Items.Clear()// clear all items
lstMeasuredValues.DataSource = _measuredValues;
}
Y llámalos cuando necesites actualizar la lista:
_measuredValues.Add(numBuffer);
RefreshList();
// Add more values
RefreshList();
Puede usar una BindingList<double>
como DataSource de su Listbox
List<double> _measuredValues = new List<double>();
BindingList<double> bindList = new BindingList<double>(_measuredValues);
lstMeasuredValues.DataSource = bindList;
Ahora, cada vez que necesite agregar un elemento, utilice la variable bindList y su listbox se actualizará automáticamente, así como su lista _measuredValues
Todo lo que necesita hacer para actualizar la lista después de la actualización:
lstMeasuredValues.Refresh();
Una de las formas más simples de hacerlo es poniendo:
lstMeasuredValues.DataSource = null; //the cheapest, trickiest, but the most important line
lstMeasuredValues.DataSource = _measuredValues;
Siempre que su elemento _measuredValues
se actualice