Winform 使用BindingList
经过探索,winform中控件继承ListControl,如Listbox、Combox、datagridview等如需使用绑定数据源的形式,
var Lbx=new ListBox();//ListControl派生控件
var list=new BindingList<T>();//T为实际数据类型
Lbx.DataSource = list;
Lbx.DisplayMember = "PropertyName";//需要显示的属性名称
然后在需要操作list的时候直接操作即可 add,remove等,以下为需要注意的地方:
- 如果控件为listbox,T为基础类型如int,此时操作list增删操作不刷新控件,临时解决方案是将基础类型再封装一层自定义类型,以便设置DisplayMember,其他Combox等不受影响;
- 在遇到线程中操作list的时候,一定要正确操作,即此时从线程中改变绑定源,如需更新界面,需要使用Lbx的Invoke()或者BeginInvoke()方法进一步封装,此原理类似于WPF更新机制;
private void OnReceivedMsg(T msg)//线程回调方法
{
Lbx.Invoke(()=>list.Add(msg));//直接使用list.Add(msg),控件不会刷新,此时也不会报错
}