1

我的 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 值。

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

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

但是网格中的状态列值没有更新。

单击数据网格列后,只有值会刷新。如何从工作线程刷新数据网格?

4

2 回答 2

2

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

可观察集合

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

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

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

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

多线程

对于多线程,您需要MyItem在 UI 线程中设置属性,即使您在工作线程中进行计算(见下文)。您可以使用Dispatcher. 请参阅使用不同线程更新 GUI (WPF)

工作线程

至于启动自己的线程,不要那样做,使用Task.

于 2015-03-09T08:58:11.373 回答
0

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

  1. 后台线程处理数据,并根据处理结果更新数据网格。
  2. WPF 中的 UI 控件只能由 UI 线程更新。
  3. 可以有多个 UI 控件协同工作以实现整体功能(进度条、按钮等)。编码人员经常犯错误,以不安全的方式传递控制引用。
  4. 数据网格将绑定到的数据源不应被任何其他类修改。

我在这里发布了一个模板。它涵盖了在多线程设置中使用数据网格的可能方法。

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

于 2016-03-21T01:44:32.307 回答