我有一个小的(可能是愚蠢的)数据绑定问题。我尝试绑定一个List
List<double> _measuredValues = new List<double>();
到winforms ListBox。
在Form_Load中,我设置了:
lstMeasuredValues.DataSource = _measuredValues;
当我更新值时,什么都没有出现?!
_measuredValues.Add(numBuffer);
我想到的一件事是数据类型问题。但是如何更改类型只是为了将其更改为字符串?
lstMeasuredValues.DataSource = _measuredValues.ToString().ToList();
另一个原因可能是代码的上面一行是在另一个线程中。但我认为这应该不是问题。
如何绑定此列表?
答案 0 :(得分:3)
更好的方法是清除项目并再次分配DataSource:
lstMeasuredValues.Items.Clear()// clear all items
lstMeasuredValues.DataSource = _measuredValues;
甚至您可以定义自己的刷新功能并调用如下:
public void RefreshList()
{
lstMeasuredValues.Items.Clear()// clear all items
lstMeasuredValues.DataSource = _measuredValues;
}
当你需要刷新列表时调用它们:
_measuredValues.Add(numBuffer);
RefreshList();
// Add more values
RefreshList();
答案 1 :(得分:3)
当我更新值时,什么都没有出现?!
_measuredValues.Add(numBuffer);
为了允许UI反映数据源修改,数据源必须提供某种更改通知。 WinForms列表数据绑定基础结构使用ListChanged event的IBindingList Interface。提供了一个标准BindingList<T> class,可以使用List<T>
代替List<double> _measuredValues = new List<double>();
来获得所需的行为。你所需要的就是改变这一行
BindingList<double> _measuredValues = new BindingList<double>();
到
ListChanged
另一个原因可能是代码的上面一行是在另一个线程中。但我认为这不应该是问题。
那不好。您必须确保不这样做,因为预计会在UI线程上引发byte
事件。
答案 2 :(得分:2)
问题在于,通用List
不是数据绑定的正确选择。如果要更新ListBox,则应使用BindingList。
尝试以这种方式使用它:
BindingList<double> bindList = new BindingList<double>(_measuredValues);
lstMeasuredValues.DataSource = bindList;
请记住,当您在_measuredValues中添加新项目时,您必须手动刷新绑定,就像我现在一样,这样:
bindList.ResetBindings();
答案 3 :(得分:1)
您可以使用BindingList<double>
作为列表框的数据源
List<double> _measuredValues = new List<double>();
BindingList<double> bindList = new BindingList<double>(_measuredValues);
lstMeasuredValues.DataSource = bindList;
现在,每当您需要添加元素时,请使用bindList变量,您的列表框将自动更新以及_measuredValues
列表
答案 4 :(得分:1)
最简单的方法之一是:
lstMeasuredValues.DataSource = null; //the cheapest, trickiest, but the most important line
lstMeasuredValues.DataSource = _measuredValues;
每当您的_measuredValues
元素更新时
答案 5 :(得分:0)
更新后,您只需刷新列表即可:
lstMeasuredValues.Refresh();