解决方案 »

  1.   

    你是不要主线程那个item改变的话,绑定的时候不要twoway
      

  2.   

    添加新的Item 为什么要使用线程呢?不知道你说的是谁的Invoke?是控件的?只要拥有ItemsSource属性的控件,都可以使用ObservableCollection 集合来作为数据源,它本身都是支持“事件通知”概念的,也就是说你add,edit,remove了 对象,都用通知到UI到显示。而非使用线程,如果使用线程 建议使用Dispatcher类。
      

  3.   

    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);
                    }
                });
      

  4.   

    不用用WInform的那一套东西来学WPF,应该从ItemsSource 改变对控件数据源的认知。它可以接受一个实现IEnumerable接口的集合,比如List集合,当然,最完美的数据储存 首选ObservableCollection集合,它支持“UI通知”,即使数据改变会通知到UI上更新显示。
    你的例子中的DataTable,虽然你绑定了,但ItemsSource 属性绑定的是Dt的DefaultView属性,因为它实现了IEnumerable接口。  新增行,就是把数据添加到了内存中,而没有实现“数据更新到UI”这个过程,控件本身不知道它的数据源有增加, 所使用Invoke 方法就将内存中的数据更新到UI。