internal override void ForceRefresh(bool sendResetNotification, bool initialLoad, bool setCurrentToFirstOnInitialLoad) { if (this.Refreshing) { throw new InvalidOperationException("An attempt was made to refresh the DataGridVirtualizingCollectionView while it is already in the process of refreshing."); } if (this.IsRefreshingDistinctValues) { throw new InvalidOperationException("An attempt was made to refresh the DataGridVirtualizingCollectionView while it is already in the process of refreshing distinct values."); } this.SetCurrentEditItem(null); int oldCurrentPosition = -1; if (!initialLoad) { this.SaveCurrentBeforeReset(out oldCurrentPosition); } using (this.DeferCurrencyEvent()) { this.Refreshing = true; try { lock (this.SyncRoot) { lock (this.DeferredOperationManager) { this.DeferredOperationManager.ClearDeferredOperations(); // We explicitly go through base so we do not end-up creating a RootGroup if there is none existing at the moment. DataGridVirtualizingCollectionViewGroupBase rootGroup = base.RootGroup as DataGridVirtualizingCollectionViewGroupBase; if (rootGroup != null) { DataGridPageManagerBase pageManager = rootGroup.GetVirtualPageManager(); // The pageManager can be null when no queryable source was set yet. if (pageManager != null) { // Disconnect the PageManager so that subsequent Items/Count interrogations are not processed. pageManager.Disconnect(); // Restart all virtual lists. The DataGridPageManagerBase will make a call to ForceRefresh once everything has been restarted if // commit operations had to be made. pageManager.Restart(); } } // Ensure to clear the DistinctValues cache when refreshing // since the source could have changed this.ResetDistinctValues(); base.RootGroup = this.CreateNewRootGroup(); // We set the current item to -1 to prevent the developper to get an invalid position. // We will replace the current item to the correct one later. this.SetCurrentItem(-1, null, false, false); } } } finally { this.Refreshing = false; } if (initialLoad) { this.Loaded = true; } else { this.AdjustCurrencyAfterReset(oldCurrentPosition); } if (sendResetNotification) { this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } this.OnPropertyChanged(new PropertyChangedEventArgs("Groups")); } }