Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added Visibility proeprty for columns #17

Merged
merged 2 commits into from
Jun 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 4 additions & 10 deletions src/WinUI.TableView/TableView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ public TableView()
{
DefaultStyleKey = typeof(TableView);

Columns = new();
CollectionView.Filter = Filter;
base.ItemsSource = CollectionView;

Expand Down Expand Up @@ -109,7 +108,7 @@ private string GetRowsContent(IEnumerable<object> items, bool includeHeaders, ch
foreach (var item in items)
{
var type = ItemsSource?.GetType() is { } listType && listType.IsGenericType ? listType.GetGenericArguments()[0] : item?.GetType();
foreach (var column in Columns.OfType<TableViewBoundColumn>())
foreach (var column in Columns.VisibleColumns.OfType<TableViewBoundColumn>())
{
var property = column.Binding.Path.Path;
if (!properties.TryGetValue(property, out var pis))
Expand All @@ -132,7 +131,7 @@ private string GetRowsContent(IEnumerable<object> items, bool includeHeaders, ch

private string GetHeadersContent(char separator)
{
return string.Join(separator, Columns.OfType<TableViewBoundColumn>().Select(x => x.Header));
return string.Join(separator, Columns.VisibleColumns.OfType<TableViewBoundColumn>().Select(x => x.Header));
}

internal async void SelectNextRow()
Expand Down Expand Up @@ -422,15 +421,11 @@ internal void ClearFilters()
}
}

public IAdvancedCollectionView CollectionView { get; private set; } = new AdvancedCollectionView();
public IAdvancedCollectionView CollectionView { get; } = new AdvancedCollectionView();

internal IDictionary<string, Predicate<object>> ActiveFilters { get; } = new Dictionary<string, Predicate<object>>();

public TableViewColumnsCollection Columns
{
get => (TableViewColumnsCollection)GetValue(ColumnsProperty);
private set => SetValue(ColumnsProperty, value);
}
public TableViewColumnsCollection Columns { get; } = new();

public double HeaderRowHeight
{
Expand Down Expand Up @@ -499,7 +494,6 @@ public bool CanFilterColumns
}

public static readonly new DependencyProperty ItemsSourceProperty = DependencyProperty.Register(nameof(ItemsSource), typeof(IList), typeof(TableView), new PropertyMetadata(null, OnItemsSourceChanged));
public static readonly DependencyProperty ColumnsProperty = DependencyProperty.Register(nameof(Columns), typeof(TableViewColumnsCollection), typeof(TableView), new PropertyMetadata(null));
public static readonly DependencyProperty HeaderRowHeightProperty = DependencyProperty.Register(nameof(HeaderRowHeight), typeof(double), typeof(TableView), new PropertyMetadata(32d, OnHeaderRowHeightChanged));
public static readonly DependencyProperty RowHeightProperty = DependencyProperty.Register(nameof(RowHeight), typeof(double), typeof(TableView), new PropertyMetadata(40d));
public static readonly DependencyProperty RowMaxHeightProperty = DependencyProperty.Register(nameof(RowMaxHeight), typeof(double), typeof(TableView), new PropertyMetadata(double.PositiveInfinity));
Expand Down
13 changes: 10 additions & 3 deletions src/WinUI.TableView/TableViewColumn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ internal set
}
}

public Visibility Visibility
{
get => (Visibility)GetValue(VisibilityProperty);
set => SetValue(VisibilityProperty, value);
}

internal double DesiredWidth { get; set; }

public bool IsAutoGenerated { get; internal set; }

private void EnsureHeaderStyle()
Expand All @@ -72,13 +80,12 @@ private void EnsureHeaderStyle()
}
}

internal double DesiredWidth { get; set; }

public static readonly DependencyProperty HeaderStyleProperty = DependencyProperty.Register(nameof(HeaderStyle), typeof(Style), typeof(TableViewColumn), new PropertyMetadata(null, (d, _) => ((TableViewColumn)d).EnsureHeaderStyle()));
public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(nameof(Header), typeof(object), typeof(TableViewColumn), new PropertyMetadata(null));
public static readonly DependencyProperty WidthProperty = DependencyProperty.Register(nameof(Width), typeof(double), typeof(TableViewColumn), new PropertyMetadata(200d));
public static readonly DependencyProperty MinWidthProperty = DependencyProperty.Register(nameof(MinWidth), typeof(double), typeof(TableViewColumn), new PropertyMetadata(50d));
public static readonly DependencyProperty MaxWidthProperty = DependencyProperty.Register(nameof(MaxWidth), typeof(double), typeof(TableViewColumn), new PropertyMetadata(double.PositiveInfinity));
public static readonly DependencyProperty CanResizeProperty = DependencyProperty.Register(nameof(CanResize), typeof(bool), typeof(TableViewColumn), new PropertyMetadata(true));
public static readonly DependencyProperty IsReadOnlyProperty = DependencyProperty.Register(nameof(IsReadOnly), typeof(bool), typeof(TableViewColumn), new PropertyMetadata(false));
}
public static readonly DependencyProperty VisibilityProperty = DependencyProperty.Register(nameof(Visibility), typeof(Visibility), typeof(TableViewColumn), new PropertyMetadata(Visibility.Visible));
}
61 changes: 59 additions & 2 deletions src/WinUI.TableView/TableViewColumnsColection.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,62 @@
using System.Collections.ObjectModel;
using Microsoft.UI.Xaml;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;

namespace WinUI.TableView;

public class TableViewColumnsCollection : ObservableCollection<TableViewColumn> { }
public class TableViewColumnsCollection : ObservableCollection<TableViewColumn>
{
private readonly Dictionary<TableViewColumn, long> _callbackMap = new();
internal event EventHandler<TableViewColumnVisibilityChanged>? ColumnVisibilityChanged;
internal IList<TableViewColumn> VisibleColumns => Items.Where(x => x.Visibility == Visibility.Visible).ToList();

protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
base.OnCollectionChanged(e);

if (e.NewItems != null)
{
var index = e.NewStartingIndex;

foreach (var column in e.NewItems.OfType<TableViewColumn>())
{
var token = column.RegisterPropertyChangedCallback(TableViewColumn.VisibilityProperty, OnColumnVisibilityChanged);
_callbackMap.Remove(column);
_callbackMap.Add(column, token);
}
}

if (e.OldItems != null)
{
foreach (var column in e.OldItems.OfType<TableViewColumn>())
{
var token = _callbackMap[column];
column.UnregisterPropertyChangedCallback(TableViewColumn.VisibilityProperty, token);
}
}
}

private void OnColumnVisibilityChanged(DependencyObject sender, DependencyProperty dp)
{
if (sender is TableViewColumn column)
{
var index = IndexOf(column);
ColumnVisibilityChanged?.Invoke(this, new TableViewColumnVisibilityChanged(column, index));
}
}
}

internal class TableViewColumnVisibilityChanged : EventArgs
{
public TableViewColumnVisibilityChanged(TableViewColumn column, int index)
{
Column = column;
Index = index;
}

public TableViewColumn Column { get; }
public int Index { get; }
}
18 changes: 16 additions & 2 deletions src/WinUI.TableView/TableViewHeaderRow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,10 @@ async void ShowAndHidOptionsFlyout()
if (TableView.Columns is not null && GetTemplateChild("HeadersStackPanel") is StackPanel stackPanel)
{
_headersStackPanel = stackPanel;
AddHeaders(TableView.Columns);
AddHeaders(TableView.Columns.VisibleColumns);

TableView.Columns.CollectionChanged += OnTableViewColumnsCollectionChanged;
TableView.Columns.ColumnVisibilityChanged += OnColumnVisibilityChanged;
}

SetExportOptionsVisibility();
Expand All @@ -86,7 +88,7 @@ private void OnTableViewColumnsCollectionChanged(object? sender, NotifyCollectio
{
if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems?.OfType<TableViewColumn>() is IEnumerable<TableViewColumn> newItems)
{
AddHeaders(newItems, e.NewStartingIndex);
AddHeaders(newItems.Where(x => x.Visibility == Visibility.Visible), e.NewStartingIndex);
}
else if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems?.OfType<TableViewColumn>() is IEnumerable<TableViewColumn> oldItems)
{
Expand All @@ -98,6 +100,18 @@ private void OnTableViewColumnsCollectionChanged(object? sender, NotifyCollectio
}
}

private void OnColumnVisibilityChanged(object? sender, TableViewColumnVisibilityChanged e)
{
if (e.Column.Visibility == Visibility.Visible)
{
AddHeaders(new[] { e.Column }, e.Index);
}
else
{
RemoveHeaders(new[] { e.Column });
}
}

private void RemoveHeaders(IEnumerable<TableViewColumn> columns)
{
if (_headersStackPanel is not null)
Expand Down
20 changes: 17 additions & 3 deletions src/WinUI.TableView/TableViewRow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,18 @@ protected override void OnApplyTemplate()

if (_tableView is not null)
{
AddCells(_tableView.Columns.VisibleColumns);

_tableView.Columns.CollectionChanged += OnColumnsCollectionChanged;
GenerateCells(_tableView.Columns);
_tableView.Columns.ColumnVisibilityChanged += OnColumnVisibilityChanged;
}
}

private void OnColumnsCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add && e.NewItems?.OfType<TableViewColumn>() is IEnumerable<TableViewColumn> newItems)
{
GenerateCells(newItems, e.NewStartingIndex);
AddCells(newItems.Where(x => x.Visibility == Visibility.Visible), e.NewStartingIndex);
}
else if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems?.OfType<TableViewColumn>() is IEnumerable<TableViewColumn> oldItems)
{
Expand All @@ -49,6 +51,18 @@ private void OnColumnsCollectionChanged(object? sender, NotifyCollectionChangedE
}
}

private void OnColumnVisibilityChanged(object? sender, TableViewColumnVisibilityChanged e)
{
if (e.Column.Visibility == Visibility.Visible)
{
AddCells(new[] { e.Column }, e.Index);
}
else
{
RemoveCells(new[] { e.Column });
}
}

private void RemoveCells(IEnumerable<TableViewColumn> columns)
{
if (_cellsStackPanel is not null)
Expand All @@ -64,7 +78,7 @@ private void RemoveCells(IEnumerable<TableViewColumn> columns)
}
}

private void GenerateCells(IEnumerable<TableViewColumn> columns, int index = -1)
private void AddCells(IEnumerable<TableViewColumn> columns, int index = -1)
{
if (_cellsStackPanel is not null)
{
Expand Down