WPF多线程界面更新 wpf多线程界面 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是不要主线程那个item改变的话,绑定的时候不要twoway 添加新的Item 为什么要使用线程呢?不知道你说的是谁的Invoke?是控件的?只要拥有ItemsSource属性的控件,都可以使用ObservableCollection 集合来作为数据源,它本身都是支持“事件通知”概念的,也就是说你add,edit,remove了 对象,都用通知到UI到显示。而非使用线程,如果使用线程 建议使用Dispatcher类。 data是一个绑定到listview.itemsource的table表格,col2,col3,col4,primarykey是table的列名 ThreadPool.QueueUserWorkItem(state => { while (true) { Random rd = new Random(); string primaryKey = string.Format("PrimaryKey:{0}", rd.Next(0, 10)); var row = data.FindByprimaryCol(primaryKey); if (row == null) { row = data.NewMyDataRow(); row.primaryCol = primaryKey; row.col1 = 1; row.col2 = string.Format("col2:{0}", rd.Next(0, 1000)); row.col3 = string.Format("col3:{0}", rd.Next(0, 1000)); row.col4 = string.Format("col4:{0}", rd.Next(0, 1000)); this.Dispatcher.Invoke(new Action(() => data.Rows.InsertAt(row, 0))); //此处一定要invoke,否则新增加的行不能显示到界面 } else { //下面这一段不通过invoke也能更新出界面数据,我想了解这样直接更新和通过invoke更新有区别么,没有区别的话是不是说只要不是添加新数据都不必去通过invoke函数来处理 row.col1 = row.col1 + 1; row.col2 = string.Format("col2:{0}", rd.Next(0, 1000)); row.col3 = string.Format("col3:{0}", rd.Next(0, 1000)); row.col4 = string.Format("col4:{0}", rd.Next(0, 1000)); } Thread.Sleep(1000); } }); 不用用WInform的那一套东西来学WPF,应该从ItemsSource 改变对控件数据源的认知。它可以接受一个实现IEnumerable接口的集合,比如List集合,当然,最完美的数据储存 首选ObservableCollection集合,它支持“UI通知”,即使数据改变会通知到UI上更新显示。你的例子中的DataTable,虽然你绑定了,但ItemsSource 属性绑定的是Dt的DefaultView属性,因为它实现了IEnumerable接口。 新增行,就是把数据添加到了内存中,而没有实现“数据更新到UI”这个过程,控件本身不知道它的数据源有增加, 所使用Invoke 方法就将内存中的数据更新到UI。 转码问题 c# 怎么把 %E5%B0%8F%E9%85%92%E7%AA%9D这个下载连接的地址变成汉字啊 WinCE的程序,如何防止程序重复运行? C#中如何关闭窗体?从内存中释放资源. 怎样用一个文件打开另一个文件 c#写入数据库的问题 多线程的问题,请求帮助! 使用ajax时页面出现sys未定义错误 问一个简单的打开问题,新手上路啊 WPF,Blend如何打开3D绘图文件? devexpress的ComboxEdit如何设置为不能编辑?也就是只读 C# 能不能读取自身菜单的name以及级别?
ThreadPool.QueueUserWorkItem(state =>
{
while (true)
{
Random rd = new Random();
string primaryKey = string.Format("PrimaryKey:{0}", rd.Next(0, 10));
var row = data.FindByprimaryCol(primaryKey);
if (row == null)
{
row = data.NewMyDataRow();
row.primaryCol = primaryKey;
row.col1 = 1;
row.col2 = string.Format("col2:{0}", rd.Next(0, 1000));
row.col3 = string.Format("col3:{0}", rd.Next(0, 1000));
row.col4 = string.Format("col4:{0}", rd.Next(0, 1000));
this.Dispatcher.Invoke(new Action(() => data.Rows.InsertAt(row, 0))); //此处一定要invoke,否则新增加的行不能显示到界面
}
else
{
//下面这一段不通过invoke也能更新出界面数据,我想了解这样直接更新和通过invoke更新有区别么,没有区别的话是不是说只要不是添加新数据都不必去通过invoke函数来处理
row.col1 = row.col1 + 1;
row.col2 = string.Format("col2:{0}", rd.Next(0, 1000));
row.col3 = string.Format("col3:{0}", rd.Next(0, 1000));
row.col4 = string.Format("col4:{0}", rd.Next(0, 1000));
}
Thread.Sleep(1000);
}
});
你的例子中的DataTable,虽然你绑定了,但ItemsSource 属性绑定的是Dt的DefaultView属性,因为它实现了IEnumerable接口。 新增行,就是把数据添加到了内存中,而没有实现“数据更新到UI”这个过程,控件本身不知道它的数据源有增加, 所使用Invoke 方法就将内存中的数据更新到UI。