在WPF DataGrid中更新单行

4
我正在创建一个下载管理器,我的WPF DataGrid 绑定到一个对象集合,表示正在进行的下载(在不同的线程中)。当我有多个下载运行时,每个下载都使用以下代码每秒更新其DataGrid项目:
if (DateTime.Now > download.LastUpdateTime.AddSeconds(1))
{
    this.downloadsGrid.Items.Refresh();
    download.LastUpdateTime = DateTime.Now;
}
Datagrid.Items.Refresh()方法可以实现刷新功能,但它会重构整个DataGrid,导致所有下载的更新在一秒钟内多次更新彼此的DataGrid行,我不想要这种行为。有没有办法只刷新DataGrid中特定的行(项目)?

如何在不刷新整个用户界面的情况下“更新”单行:https://dev59.com/zGgu5IYBdhLWcg3wbWk9#74770140 - Kamil Pająk
2个回答

9

如果您将DataGrid绑定到一个实现了INotifyCollectionChangedObservableCollection(可观察集合),当添加或删除项目时,DataGrid将得到通知。此外,如果您只是更新集合中对象的属性,则该对象应实现INotifyPropertyChanged并引发PropertyChanged事件,这将告诉DataGrid仅更新该值。


感谢 shriek 和 Dan Busha。我有一个 List<WebDownloadClient>,但我将切换到 ObservableCollection<WebDownloadClient> 并在 WebDownloadClient 上实现 INotifyPropertyChanged,通过每秒调用 PropertyChanged 事件处理程序来更新 datagrid。 - marko
如果您想根据可观察集合中项目的状态更改背景颜色,该怎么办? - Stefan Vasiljevic
你需要修改DataRow的样式,并将背景值绑定到ObservableCollection中行项的Brush属性上。 - Dan Busha

8

你的下载类实现了 INotifyPropertyChanged 吗?如果没有,那就是为什么你必须调用 refresh 才能在表格中看到变化。如果你实现了 INotifyPropertyChanged,那么当值改变时绑定将被更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接