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)