diff --git a/src/TableView.cs b/src/TableView.cs
index e9ee5e50..206d74e4 100644
--- a/src/TableView.cs
+++ b/src/TableView.cs
@@ -392,6 +392,11 @@ private void OnScrollViewerLoaded(object sender, RoutedEventArgs e)
///
private void OnLoaded(object sender, RoutedEventArgs e)
{
+ if (_isItemsSourceSuspended) // indicates that the control was unloaded and loaded back
+ {
+ _headerRow?.CalculateHeaderWidths(); // Needed when switching back to an existing TableView (without provided column Widths)
+ }
+
ResumeItemsSource();
EnsureAutoColumns();
}
diff --git a/src/TableViewHeaderRow.cs b/src/TableViewHeaderRow.cs
index 2c302ba0..6aed1b71 100644
--- a/src/TableViewHeaderRow.cs
+++ b/src/TableViewHeaderRow.cs
@@ -41,6 +41,7 @@ public partial class TableViewHeaderRow : Control
private Border? _columnDropIndicator;
private TranslateTransform? _columnDropIndicatorTransform;
private Image? _dragHeaderImage;
+ private DispatcherTimer? _desiredWidthTimer;
private bool _calculatingHeaderWidths;
private int _dropColumnIndex;
private bool _isValidDropTarget;
@@ -201,6 +202,28 @@ e.PropertyName is nameof(TableViewColumn.IsFrozen)) &&
CalculateHeaderWidths();
}
}
+ else if (e.PropertyName is nameof(TableViewColumn.DesiredWidth))
+ {
+ // Coalesce multiple updates (see in-loop Measure() call in CalculateHeaderWidths) to avoid excessive header width calculations.
+ _desiredWidthTimer ??= new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(250) };
+ _desiredWidthTimer.Tick -= OnDesiredWidthTimerTick;
+ _desiredWidthTimer.Tick += OnDesiredWidthTimerTick;
+ _desiredWidthTimer.Stop();
+ _desiredWidthTimer.Start();
+ }
+ }
+
+ ///
+ /// Recalculates header widths after deferred desired-width updates.
+ ///
+ private void OnDesiredWidthTimerTick(object? sender, object e)
+ {
+ _desiredWidthTimer?.Stop();
+
+ if (!_calculatingHeaderWidths)
+ {
+ CalculateHeaderWidths();
+ }
}
///