WPF多线程界面更新

cyhf00808 2014-11-17 03:04:08
例如ListView绑定了一个ItemsSource。貌似用非主线程添加新item不会更新到界面,只能通过invoke或者begininoke更新。
更新已存在的item属性却会更新到界面。
那么更新已存在item的属性用不用invoke方法有什么区别有人知道么?
有没有这方面的资料参考下,谢谢
...全文
268 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
exception92 2014-11-17
  • 打赏
  • 举报
回复
引用 3 楼 cyhf00808 的回复:
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。
cyhf00808 2014-11-17
  • 打赏
  • 举报
回复
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); } });
exception92 2014-11-17
  • 打赏
  • 举报
回复
添加新的Item 为什么要使用线程呢?不知道你说的是谁的Invoke?是控件的? 只要拥有ItemsSource属性的控件,都可以使用ObservableCollection 集合来作为数据源,它本身都是支持“事件通知”概念的,也就是说你add,edit,remove了 对象,都用通知到UI到显示。而非使用线程,如果使用线程 建议使用Dispatcher类。
opf110 2014-11-17
  • 打赏
  • 举报
回复
你是不要主线程那个item改变的话,绑定的时候不要twoway

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧