Some instructions for setting the visibility of GridViewColumn items in WPF.
Some useful StackOverflow links as follows:
https://stackoverflow.com/questions/1392811/c-wpf-make-a-gridviewcolumn-visible-false
Helge Klein‘s contribution was particularly useful.
Step 1: Create a new WPF application
Step 2: Create the ViewModel class
Our ViewModel class for inserting items into our ListView plus other required properties…
Inherits from INotifyPropertyChanged in order to implement the OnPropertyChanged.
MainWindowViewModel.cs
using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; using EnableWpfColumn.Annotations; namespace EnableWpfColumn { public class Item { public Item(string name, string matches) { Name = name; Matches = matches; } public string Name { get; set; } public string Matches { get; set; } } public class ItemHandler { public ItemHandler() { Items = new List<Item>(); } public List<Item> Items { get; set; } public void Add(Item item) { Items.Add(item); } } public class MainWindowViewModel : INotifyPropertyChanged { private readonly ItemHandler _itemHandler; private bool _nameColumnVisible; public MainWindowViewModel() { _itemHandler = new ItemHandler(); _itemHandler.Add(new Item("John Doe", "12")); _itemHandler.Add(new Item("Jane Doe", "133")); _itemHandler.Add(new Item("Sammy Doe", "45")); _nameColumnVisible = true; } public List<Item> Items { get { return _itemHandler.Items; } set { if (_itemHandler != null) _itemHandler.Items = value; OnPropertyChanged(nameof(Items)); } } public bool NameColumnVisible { get { return _nameColumnVisible; } set { if (_itemHandler != null) _nameColumnVisible = value; OnPropertyChanged(nameof(NameColumnVisible)); } } public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
Step 3: Incorporate the standard boolean-to-visibility conversion in your app
App.xaml
<Application x:Class="EnableWpfColumn.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml"> <Application.Resources> <BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" /> </Application.Resources> </Application>
Step 4: Create an attached property on the header to set the column’s width to zero
GridViewBehaviours.cs
using System.Windows; using System.Windows.Controls; namespace EnableWpfColumn { public class GridViewBehaviours { public static readonly DependencyProperty CollapseableColumnProperty = DependencyProperty.RegisterAttached("CollapseableColumn", typeof(bool), typeof(GridViewBehaviours), new UIPropertyMetadata(false, OnCollapseableColumnChanged)); public static bool GetCollapseableColumn(DependencyObject d) { return (bool) d.GetValue(CollapseableColumnProperty); } public static void SetCollapseableColumn(DependencyObject d, bool value) { d.SetValue(CollapseableColumnProperty, value); } private static void OnCollapseableColumnChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) { var header = sender as GridViewColumnHeader; if (header == null) return; header.IsVisibleChanged += AdjustWidth; } private static void AdjustWidth(object sender, DependencyPropertyChangedEventArgs e) { var header = sender as GridViewColumnHeader; if (header == null) return; header.Column.Width = header.Visibility == Visibility.Collapsed ? 0 : double.NaN; } } }
Step 5: Update the MainWindow.xaml to include the ListView control
MainWindow.xaml
<Window x:Class="EnableWpfColumn.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:EnableWpfColumn" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Window.DataContext> <local:MainWindowViewModel /> </Window.DataContext> <Window.Resources> <Style x:Key="ListViewStyle" TargetType="{x:Type GridViewColumnHeader}"> <Setter Property="HorizontalContentAlignment" Value="Left" /> </Style> <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> </Window.Resources> <Grid> <ListView Margin="10" ItemsSource="{Binding Items}" HorizontalAlignment="Left" HorizontalContentAlignment="Left"> <ListView.View> <GridView> <GridViewColumn HeaderContainerStyle="{StaticResource ListViewStyle}" DisplayMemberBinding="{Binding Name}"> <GridViewColumnHeader Content="Name" Visibility="{Binding NameColumnVisible, Converter={StaticResource BooleanToVisibilityConverter}}" local:GridViewBehaviours.CollapseableColumn="True" /> </GridViewColumn> <GridViewColumn HeaderContainerStyle="{StaticResource ListViewStyle}" Header="Matches" Width="80" DisplayMemberBinding="{Binding Matches}" /> </GridView> </ListView.View> </ListView> </Grid> </Window>
Step 6: Try it with different property settings
With ‘NameColumnVisible’ property set to boolean true:
With ‘NameColumnVisible’ property set to boolean false. Specified ‘Name’ column is no longer visible as shown: