从工作线程刷新DataGrid

时间:2015-03-09 08:23:08

标签: c# wpf datagrid worker-thread

我的WPF应用程序中有一个DataGrid。对于这个DataGrid,我将ItemSource设置如下

ItemsSource="{Binding Path=MyItems}"

MyItems是MyViewModel中声明的MyItem的列表

    // ItemsSource for MyItem Grid
    public List<MyItem> MyItems {get;set; }

MyItem具有一组属性,每个属性都映射到DataGrid中的每一列。在初始化时,我正在填充MyItems;因此DataGrid在每列中显示MyItems值。

在按钮命令中,我正在创建一个Worker线程,Worker线程修改了Grid中显示的MyItems的属性。例如,MyItem有一个名为&#34; Status&#34;的属性。绑定到一列网格。在workerthread中更改状态值。我正在调用的工作线程结束

OnPropertyChanged("MyItems"); //force UI refresh

但网格中的状态列值未更新。

单击datagrid列后,只会刷新值。如何从工作线程刷新datagrid?

2 个答案:

答案 0 :(得分:2)

如果你做得对,你不需要告诉网格刷新。如果您设法刷新整个网格,也会产生意想不到的后果,例如跳转到网格顶部并丢失任何用户选定的行/单元格以及中止编辑(如果适用)。

ObservableCollection

这是你应该如何设置网格正在查看的列表:

private readonly ObservableCollection<MyItem> _myItems = new ObservableCollection<MyItem>();

public IEnumerable<MyItem> MyItems { get { return _myItems; } }

这意味着新项目和删除会自动更新网格。但是,要更新单个单元格,该属性需要是可观察的,即类MyItem必须实现INotifyPropertyChanged

多线程

对于多线程,您需要在UI线程中的MyItem上设置属性,即使您在工作线程中进行计算(参见下文)。您可以使用Dispatcher来实现此目的。见Updating GUI (WPF) using a different thread

工作线程

至于开始自己的线程,不要这样做,请使用Task

答案 1 :(得分:0)

使用调度程序不是一个好主意。如果编码不正确,UI可能会变得无响应。在多线程环境中使用datagrid很棘手。

  1. 后台线程处理数据并基于此结果 处理后,数据网格将被更新。
  2. WPF中的UI控件只能由UI线程更新。
  3. 可以有多个UI控件可以一起使用 实现整体功能(进度条,按钮等)。 编码器经常会错误地将控制引用传递给 不安全的方式。
  4. 数据网格将绑定到的数据源不应该是 任何其他类别都可以修改。
  5. 我在这里发布了一个模板。它介绍了在多线程设置中使用datagrid的可能方法。

    http://www.codeproject.com/Articles/1086714/A-Template-For-Using-Datagrid-in-Monitoring-UI