Here is an example that uses attributes to hide columns. It uses an attached property to handle an AutoGeneratingColumn event.
HideColumnIfAutoGenerated.cs - Attribute
namespace AutoHideColumn { public class HideColumnIfAutoGenerated : System.Attribute { public HideColumnIfAutoGenerated() { } } }
DataGridExtension.cs - attached property
using System.ComponentModel; using System.Windows; using System.Windows.Controls; namespace AutoHideColumn { public static class DataGridExtension { public static readonly DependencyProperty HideAnnotatedColumnsProperty = DependencyProperty.RegisterAttached( "HideAnnotatedColumns", typeof(bool), typeof(DataGridExtension), new UIPropertyMetadata(false, OnHideAnnotatedColumns)); public static bool GetHideAnnotatedColumns(DependencyObject d) { return (bool)d.GetValue(HideAnnotatedColumnsProperty); } public static void SetHideAnnotatedColumns(DependencyObject d, bool value) { d.SetValue(HideAnnotatedColumnsProperty, value); } private static void OnHideAnnotatedColumns(DependencyObject d, DependencyPropertyChangedEventArgs e) { bool hideAnnotatedColumns = (bool)e.NewValue; DataGrid dataGrid = d as DataGrid; if (hideAnnotatedColumns) { dataGrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn; } else { dataGrid.AutoGeneratingColumn -= dataGrid_AutoGeneratingColumn; } } private static void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { PropertyDescriptor propertyDescriptor = e.PropertyDescriptor as PropertyDescriptor; if (propertyDescriptor != null) { foreach (var item in propertyDescriptor.Attributes) { if (item.GetType() == typeof(HideColumnIfAutoGenerated)) { e.Cancel = true; } } } } } }
Xaml
<Window x:Class="AutoHideColumn.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:AutoHideColumn" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <DataGrid Name="dg" local:DataGridExtension.HideAnnotatedColumns="True"> </DataGrid> <DataGrid Grid.Row="1" Name="dg1"> </DataGrid> </Grid> </Window>
CodeBehind
using System.Collections.Generic; using System.Windows; namespace AutoHideColumn {
source share