我的 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”的属性,该属性绑定(bind)到网格的列。状态值在工作线程中更改。我正在调用的工作线程结束
OnPropertyChanged("MyItems"); //force UI refresh
但是网格中的状态列值没有更新。
单击数据网格列后,只有值会刷新。如何从工作线程刷新数据网格?
最佳答案
如果你做得正确,你就不需要告诉网格刷新。如果您确实设法刷新整个网格,也会产生意想不到的后果,例如跳到网格顶部并丢失任何用户选择的行/单元格以及中止编辑(如果适用)。
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
.
关于c# - 从工作线程刷新 DataGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28937674/