c# - 从工作线程刷新 DataGrid

标签 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 值。

在按钮命令中,我正在创建一个工作线程,工作线程修改网格中显示的 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/

相关文章:

c# - 从 C# "Unicode"字符串中删除除字母和数字之外的所有字符

c# - 如何在 TFS 2010 中重置迭代?

c# - 从 XML 中删除元素

c# - 给定一个对象,它是一个枚举值数组,我如何在不知道枚举类型的情况下获得一个 Enum[]

c# - ComputedVerticalScrollBarVisibility 触发器在使用绑定(bind)/转换器时不起作用

c# - 为什么这个翻译动画不起作用?

c# - 繁重的 TPL 后台线程在 WPF 的 UI 线程中产生滞后

c# - 为什么纯 IEnumerable 的内容对于 WPF DataGrid 是不可见的?

javascript - fetchItemByIdentity() 没有按预期工作

apache-flex - 弹性 3 : How do I get the DataGridColumn's dataField in its ItemRenderer?