我的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?
答案 0 :(得分:2)
如果你做得对,你不需要告诉网格刷新。如果您设法刷新整个网格,也会产生意想不到的后果,例如跳转到网格顶部并丢失任何用户选定的行/单元格以及中止编辑(如果适用)。
这是你应该如何设置网格正在查看的列表:
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很棘手。
我在这里发布了一个模板。它介绍了在多线程设置中使用datagrid的可能方法。
http://www.codeproject.com/Articles/1086714/A-Template-For-Using-Datagrid-in-Monitoring-UI