diff --git a/samples/TreeDataGridDemo/MainWindow.axaml b/samples/TreeDataGridDemo/MainWindow.axaml
index c3f192f7..0c6268a7 100644
--- a/samples/TreeDataGridDemo/MainWindow.axaml
+++ b/samples/TreeDataGridDemo/MainWindow.axaml
@@ -26,6 +26,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/TreeDataGridDemo/ViewModels/CountriesPageViewModel.cs b/samples/TreeDataGridDemo/ViewModels/CountriesPageViewModel.cs
index 2be1344c..50fe5b99 100644
--- a/samples/TreeDataGridDemo/ViewModels/CountriesPageViewModel.cs
+++ b/samples/TreeDataGridDemo/ViewModels/CountriesPageViewModel.cs
@@ -31,6 +31,7 @@ public CountriesPageViewModel()
new TextColumn("GDP", x => x.GDP, new GridLength(3, GridUnitType.Star), new()
{
TextAlignment = Avalonia.Media.TextAlignment.Right,
+ IsVisible = true,
MaxWidth = new GridLength(150)
}),
}
diff --git a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnBase`1.cs b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnBase`1.cs
index 4d2e9a94..76b8f7dc 100644
--- a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnBase`1.cs
+++ b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnBase`1.cs
@@ -51,7 +51,7 @@ public double ActualWidth
///
/// To set the column width use .
///
- public GridLength Width
+ public GridLength Width
{
get => _width;
private set => RaiseAndSetIfChanged(ref _width, value);
@@ -92,7 +92,10 @@ public ListSortDirection? SortDirection
bool? IColumn.CanUserResize => Options.CanUserResizeColumn;
double IUpdateColumnLayout.MinActualWidth => CoerceActualWidth(0);
- double IUpdateColumnLayout.MaxActualWidth => CoerceActualWidth(double.PositiveInfinity);
+ double IUpdateColumnLayout.MaxActualWidth =>
+ IsVisible
+ ? CoerceActualWidth(double.PositiveInfinity)
+ : 0;
bool IUpdateColumnLayout.StarWidthWasConstrained => _starWidthWasConstrained;
///
@@ -106,6 +109,10 @@ public ListSortDirection? SortDirection
double IUpdateColumnLayout.CellMeasured(double width, int rowIndex)
{
+ if (!Options.IsVisible)
+ {
+ return 0;
+ }
_autoWidth = Math.Max(NonNaN(_autoWidth), CoerceActualWidth(width));
return Width.GridUnitType == GridUnitType.Auto || double.IsNaN(ActualWidth) ?
_autoWidth : ActualWidth;
@@ -179,5 +186,19 @@ private void SetWidth(GridLength width)
}
private static double NonNaN(double v) => double.IsNaN(v) ? 0 : v;
+
+ public bool IsVisible
+ {
+ get => Options.IsVisible;
+ set
+ {
+ if (Options.IsVisible != value)
+ {
+ Options.IsVisible = value;
+ RaisePropertyChanged(nameof(IsVisible));
+ }
+ }
+ }
+
}
}
diff --git a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnList.cs b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnList.cs
index 6393108c..6c475078 100644
--- a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnList.cs
+++ b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnList.cs
@@ -196,5 +196,9 @@ private void UpdateColumnSizes()
}
private static double NotNaN(double v) => double.IsNaN(v) ? 0 : v;
+
+ void IColumns.InvalidateLayout() =>
+ LayoutInvalidated?.Invoke(this,EventArgs.Empty);
+
}
}
diff --git a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnOptions.cs b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnOptions.cs
index 61cf5994..2b75a616 100644
--- a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnOptions.cs
+++ b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/ColumnOptions.cs
@@ -85,5 +85,9 @@ public class ColumnOptions
/// Gets or sets the gesture(s) that will cause a cell to enter edit mode.
///
public BeginEditGestures BeginEditGestures { get; set; } = BeginEditGestures.Default;
+
+ /// Determines whether or not this column is visible.
+ ///
+ public bool IsVisible { get; set; } = true;
}
}
diff --git a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/HierarchicalExpanderColumn.cs b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/HierarchicalExpanderColumn.cs
index 0755ca0a..9d17a440 100644
--- a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/HierarchicalExpanderColumn.cs
+++ b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/HierarchicalExpanderColumn.cs
@@ -23,6 +23,7 @@ public class HierarchicalExpanderColumn : NotifyingBase,
private readonly TypedBinding? _hasChildrenSelector;
private readonly TypedBinding? _isExpandedBinding;
private double _actualWidth = double.NaN;
+ private bool _isVisible = true;
///
/// Initializes a new instance of the class.
@@ -160,5 +161,11 @@ private void SetWidth(GridLength width)
if (width.IsAbsolute)
ActualWidth = width.Value;
}
+
+ public bool IsVisible
+ {
+ get => _isVisible;
+ set => RaiseAndSetIfChanged(ref _isVisible, value);
+ }
}
}
diff --git a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/IColumn.cs b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/IColumn.cs
index 21ba7496..9a5b431c 100644
--- a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/IColumn.cs
+++ b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/IColumn.cs
@@ -47,5 +47,10 @@ public interface IColumn : INotifyPropertyChanged
/// Gets or sets a user-defined object attached to the column.
///
object? Tag { get; set; }
+
+ ///
+ /// Determines whether or not this column is visible.
+ ///
+ bool IsVisible { get; set; }
}
}
diff --git a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/IColumns.cs b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/IColumns.cs
index b54d2bd0..c6182e15 100644
--- a/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/IColumns.cs
+++ b/src/Avalonia.Controls.TreeDataGrid/Models/TreeDataGrid/IColumns.cs
@@ -65,5 +65,10 @@ public interface IColumns : IReadOnlyList, INotifyCollectionChanged
///
/// The current viewport.
void ViewportChanged(Rect viewport);
+
+ ///
+ /// Signal that the columns layout has changed.
+ ///
+ void InvalidateLayout();
}
}
diff --git a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridColumnHeader.cs b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridColumnHeader.cs
index 8098a82a..55cf5985 100644
--- a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridColumnHeader.cs
+++ b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridColumnHeader.cs
@@ -30,6 +30,7 @@ public class TreeDataGridColumnHeader : Button
private ListSortDirection? _sortDirection;
private TreeDataGrid? _owner;
private Thumb? _resizer;
+ private static readonly GridLength Zero = new GridLength(0, GridUnitType.Pixel);
public bool CanUserResize
{
@@ -146,7 +147,9 @@ private void OnModelPropertyChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(IColumn.CanUserResize) ||
e.PropertyName == nameof(IColumn.Header) ||
- e.PropertyName == nameof(IColumn.SortDirection))
+ e.PropertyName == nameof(IColumn.SortDirection)
+ || e.PropertyName == nameof(IColumn.IsVisible)
+ )
UpdatePropertiesFromModel();
}
@@ -174,9 +177,16 @@ private void ResizerDragDelta(object? sender, VectorEventArgs e)
private void UpdatePropertiesFromModel()
{
+ var oldVisibility = IsVisible;
CanUserResize = _model?.CanUserResize ?? _owner?.CanUserResizeColumns ?? false;
Header = _model?.Header;
SortDirection = _model?.SortDirection;
+ IsVisible = _model?.IsVisible == true;
+ if(IsVisible!= oldVisibility)
+ {
+ _columns?.InvalidateLayout();
+ }
+
}
}
}
diff --git a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridColumnHeadersPresenter.cs b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridColumnHeadersPresenter.cs
index 085dcaba..3a51120e 100644
--- a/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridColumnHeadersPresenter.cs
+++ b/src/Avalonia.Controls.TreeDataGrid/Primitives/TreeDataGridColumnHeadersPresenter.cs
@@ -20,9 +20,12 @@ protected override Size ArrangeOverride(Size finalSize)
protected override Size MeasureElement(int index, Control element, Size availableSize)
{
- var columns = (IColumns)Items!;
- element.Measure(availableSize);
- return columns.CellMeasured(index, -1, element.DesiredSize);
+ if (Items is IColumns columns)
+ {
+ element.Measure(availableSize);
+ return columns.CellMeasured(index, -1, element.DesiredSize);
+ }
+ return default;
}
protected override void RealizeElement(Control element, IColumn column, int index)