使用另一个线程修改绑定数据表时,不会刷新Datagrid

时间:2014-01-29 05:19:22

标签: c# wpf data-binding datagrid datatable

方案: 在View Model中有一个绑定到数据表的数据网格。此数据表引用将注入Model,并使用后台线程进行更新。

结果: 更新基础数据表后,Datagrid不会立即刷新,但如果我在不同选项卡之间切换,则datagrid将显示数据表中存在的最新值。

1 个答案:

答案 0 :(得分:1)

一种常见的方法是启动 background task 来更新数据表异步,并在使用.ContinueWith完成此操作时进行连接以更新UI。

Task.Factory.StartNew(() => { ..Do the background DataTable update.. })
            .ContinueWith(task => {.. Update the UI.. });



但由于STA限制,您必须 dispatch .ContinueWith对主线程的操作。

Task.Factory.StartNew(() => { ..Do the background DataTable update.. })
                .ContinueWith(task => 
                             {
                                var dispatcher = Application.Current == null
                                     ? Dispatcher.CurrentDispatcher
                                     : Application.Current.Dispatcher;

                                Action action = delegate()
                                                {
                                                    //Update UI (e.g. Raise NotifyPropertyChanged on bound DataTable Property)
                                                 };

                               dispatcher.Invoke(DispatcherPriority.Normal, action);
});



由于Dispatching操作是一个重复操作,我建议将逻辑放入ViewModelBase类中以减少代码,如下所示:

Task.Factory.StartNew(() => ..Do the background DataTable update..)
            .ContinueWith(task => Dispatch(() =>
                {
                    //Update UI
                }));



要更新UI,您可以使用INotifyPropertyChanged的公共通知来提升绑定数据表上的属性更改事件。