I'm creating a download manager, and my WPF datagrid is bound to a collection of objects representing ongoing downloads (in separate threads). When I have multiple downloads running, each one is using this code to update its datagrid item every second:
if (DateTime.Now > download.LastUpdateTime.AddSeconds(1))
{
this.downloadsGrid.Items.Refresh();
download.LastUpdateTime = DateTime.Now;
}
Datagrid.Items.Refresh() does the job, but it reconstructs the whole datagrid, causing all downloads to update each others datagrid rows several times in one second, and I don't want that kind of behavior. Is there any way to refresh a specific row (item) in a datagrid?
If you bind your DataGrid to an ObservableCollection (which implements INotifyCollectionChanged) your DataGrid will be notified when a new item is added or an item is remove. Additionally, if you're just updating a property on an object in the collection the object should implement INotifyPropertyChanged and raise the PropertyChanged event which will tell the DataGrid to just update that value.
Does your download class implement
INotifyPropertyChanged
? If not, that's why you have to call refresh to see a change in the grid. If you implementINotifyPropertyChanged
the binding will be updated when the value is changed.