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(); + } } ///