WPF DatagridTextColumn width set via Header style and behavior
<DataGrid.Columns> <DataGridTextColumn Binding="{Binding Id}" Header="Id"/> <DataGridTextColumn Binding="{Binding Name}" Header="Name"/> <DataGridTextColumn Binding="{Binding Title}" Header="Title"/> <DataGridTextColumn Binding="{Binding ISBN}" Header="ISBN"/> <DataGridTextColumn Binding="{Binding Summary}" Header="Summary"/> </DataGrid.Columns>
<DataGrid.Resources> <Style TargetType="DataGridColumnHeader" x:Key="ColumnHeaderStyle"> <Setter Property="Width" Value="500" /> <!-- Default width --> <Style.Triggers> <DataTrigger Binding="{Binding DataContext.ColumnWidth, RelativeSource={RelativeSource AncestorType=DataGrid}}" Value="200"> <Setter Property="Width" Value="500" /> </DataTrigger> </Style.Triggers> </Style> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Id}" Header="Id" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> <DataGridTextColumn Binding="{Binding Name}" Header="Name" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> <DataGridTextColumn Binding="{Binding Title}" Header="Title" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> <DataGridTextColumn Binding="{Binding ISBN}" Header="ISBN" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> <DataGridTextColumn Binding="{Binding Summary}" Header="Summary" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> </DataGrid.Columns>
Install-Package Microsoft.Xaml.Behaviors.Wpf -Version 1.1.39 public class ColumnWidth1XBehavior : Behavior<DataGridColumn> { public static readonly DependencyProperty WidthProperty = DependencyProperty.Register(nameof(Width), typeof(double), typeof(ColumnWidth1XBehavior), new PropertyMetadata(1.0d, OnWidthChanged)); public double Width { get => (double)GetValue(WidthProperty); set => SetValue(WidthProperty, value); } protected override void OnAttached() { base.OnAttached(); AssociatedObject.Width = new DataGridLength(Width, DataGridLengthUnitType.Star); } private static void OnWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var behavior = (ColumnWidth1XBehavior)d; behavior.AssociatedObject.Width = new DataGridLength((double)e.NewValue, DataGridLengthUnitType.Star); } } public class ColumnWidth2XBehavior : Behavior<DataGridColumn> { public static readonly DependencyProperty WidthProperty = DependencyProperty.Register("Width", typeof(double), typeof(ColumnWidth2XBehavior), new PropertyMetadata(2.0, OnWidthChanged)); public double Width { get { return (double)GetValue(WidthProperty); } set { SetValue(WidthProperty, value); } } private static void OnWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var behavior = (ColumnWidth2XBehavior)d; behavior.AssociatedObject.Width = new DataGridLength((double)e.NewValue, DataGridLengthUnitType.Star); } protected override void OnAttached() { base.OnAttached(); AssociatedObject.Width = new DataGridLength(Width, DataGridLengthUnitType.Star); } } public class ColumnWidth3XBehavior : Behavior<DataGridColumn> { public static readonly DependencyProperty WidthProperty = DependencyProperty.Register("Width", typeof(double), typeof(ColumnWidth3XBehavior), new PropertyMetadata(3.0, OnWidthChanged)); public double Width { get { return (double)GetValue(WidthProperty); } set { SetValue(WidthProperty, value); } } private static void OnWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var behavior = (ColumnWidth3XBehavior)d; behavior.AssociatedObject.Width = new DataGridLength((double)e.NewValue, DataGridLengthUnitType.Star); } protected override void OnAttached() { base.OnAttached(); AssociatedObject.Width = new DataGridLength(Width, DataGridLengthUnitType.Star); } } //xaml <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Id}" Header="Id" > <i:Interaction.Behaviors> <local:ColumnWidth1XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding Name}" Header="Name"> <i:Interaction.Behaviors> <local:ColumnWidth2XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding Title}" Header="Title"> <i:Interaction.Behaviors> <local:ColumnWidth3XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding ISBN}" Header="ISBN"> <i:Interaction.Behaviors> <local:ColumnWidth3XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding Summary}" Header="Summary"> <i:Interaction.Behaviors> <local:ColumnWidth3XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> </DataGrid.Columns>
1X,2X,3X,3X,3X
Install-Package Microsoft.Xaml.Behaviors.Wpf -Version 1.1.39 //xaml <Window x:Class="WpfApp29.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:system="clr-namespace:System;assembly=mscorlib" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:local="clr-namespace:WpfApp29" WindowState="Maximized" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding BooksList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectionMode="Extended" IsReadOnly="True"> <DataGrid.Resources> <Style TargetType="DataGridColumnHeader" x:Key="ColumnHeaderStyle"> <Setter Property="Width" Value="500" /> <!-- Default width --> <Style.Triggers> <DataTrigger Binding="{Binding DataContext.ColumnWidth, RelativeSource={RelativeSource AncestorType=DataGrid}}" Value="200"> <Setter Property="Width" Value="500" /> </DataTrigger> </Style.Triggers> </Style> </DataGrid.Resources> <DataGrid.RowStyle> <Style TargetType="{x:Type DataGridRow}"> <Setter Property="Height" Value="100"/> <Setter Property="FontSize" Value="30"/> </Style> </DataGrid.RowStyle> <DataGrid.Columns> <!--<DataGridTextColumn Binding="{Binding Id}" Header="Id"/> <DataGridTextColumn Binding="{Binding Name}" Header="Name"/> <DataGridTextColumn Binding="{Binding Title}" Header="Title"/> <DataGridTextColumn Binding="{Binding ISBN}" Header="ISBN"/> <DataGridTextColumn Binding="{Binding Summary}" Header="Summary"/>--> <!--<DataGridTextColumn Binding="{Binding Id}" Header="Id" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> <DataGridTextColumn Binding="{Binding Name}" Header="Name" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> <DataGridTextColumn Binding="{Binding Title}" Header="Title" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> <DataGridTextColumn Binding="{Binding ISBN}" Header="ISBN" HeaderStyle="{StaticResource ColumnHeaderStyle}"/> <DataGridTextColumn Binding="{Binding Summary}" Header="Summary" HeaderStyle="{StaticResource ColumnHeaderStyle}"/>--> <DataGridTextColumn Binding="{Binding Id}" Header="Id" > <i:Interaction.Behaviors> <local:ColumnWidth1XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding Name}" Header="Name"> <i:Interaction.Behaviors> <local:ColumnWidth2XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding Title}" Header="Title"> <i:Interaction.Behaviors> <local:ColumnWidth3XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding ISBN}" Header="ISBN"> <i:Interaction.Behaviors> <local:ColumnWidth3XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding Summary}" Header="Summary"> <i:Interaction.Behaviors> <local:ColumnWidth3XBehavior/> </i:Interaction.Behaviors> </DataGridTextColumn> </DataGrid.Columns> </DataGrid> </Grid> </Window> //cs using Microsoft.Xaml.Behaviors; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp29 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); var vm = new MainVM(this); this.DataContext = vm; } } public class MainVM : INotifyPropertyChanged { Window mainWin; FrameworkElement fe; public MainVM(Window winValue) { mainWin = winValue; if (mainWin != null) { mainWin.Loaded += MainWin_Loaded; mainWin.SizeChanged += MainWin_SizeChanged; } } private void MainWin_SizeChanged(object sender, SizeChangedEventArgs e) { Init(); } private void MainWin_Loaded(object sender, RoutedEventArgs e) { Init(); } private void Init() { var tempFe = mainWin.Content as FrameworkElement; if (tempFe != null) { fe = tempFe; } InitBooksList(); } private void InitBooksList() { BooksList = new ObservableCollection<Book>(); for (int i = 0; i < 1000; i++) { BooksList.Add(new Book() { Id = i + 1, Name = $"Name_{i + 1}", Title = $"Title_{i + 1}", ISBN = $"ISBN_{i + 1}_{Guid.NewGuid().ToString("N")}", Summary = $"Summary_{i + 1}" }); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName] string propertyName = "") { var handler = PropertyChanged; if (handler != null) { handler?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } private ObservableCollection<Book> booksList; public ObservableCollection<Book> BooksList { get { return booksList; } set { if (booksList != value) { booksList = value; OnPropertyChanged(); } } } } public class Book { public int Id { get; set; } public string Name { get; set; } public string Title { get; set; } public string ISBN { get; set; } public string Summary { get; set; } } public class ColumnWidth1XBehavior : Behavior<DataGridColumn> { public static readonly DependencyProperty WidthProperty = DependencyProperty.Register(nameof(Width), typeof(double), typeof(ColumnWidth1XBehavior), new PropertyMetadata(1.0d, OnWidthChanged)); public double Width { get => (double)GetValue(WidthProperty); set => SetValue(WidthProperty, value); } protected override void OnAttached() { base.OnAttached(); AssociatedObject.Width = new DataGridLength(Width, DataGridLengthUnitType.Star); } private static void OnWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var behavior = (ColumnWidth1XBehavior)d; behavior.AssociatedObject.Width = new DataGridLength((double)e.NewValue, DataGridLengthUnitType.Star); } } public class ColumnWidth2XBehavior : Behavior<DataGridColumn> { public static readonly DependencyProperty WidthProperty = DependencyProperty.Register("Width", typeof(double), typeof(ColumnWidth2XBehavior), new PropertyMetadata(2.0, OnWidthChanged)); public double Width { get { return (double)GetValue(WidthProperty); } set { SetValue(WidthProperty, value); } } private static void OnWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var behavior = (ColumnWidth2XBehavior)d; behavior.AssociatedObject.Width = new DataGridLength((double)e.NewValue, DataGridLengthUnitType.Star); } protected override void OnAttached() { base.OnAttached(); AssociatedObject.Width = new DataGridLength(Width, DataGridLengthUnitType.Star); } } public class ColumnWidth3XBehavior : Behavior<DataGridColumn> { public static readonly DependencyProperty WidthProperty = DependencyProperty.Register("Width", typeof(double), typeof(ColumnWidth3XBehavior), new PropertyMetadata(3.0, OnWidthChanged)); public double Width { get { return (double)GetValue(WidthProperty); } set { SetValue(WidthProperty, value); } } private static void OnWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var behavior = (ColumnWidth3XBehavior)d; behavior.AssociatedObject.Width = new DataGridLength((double)e.NewValue, DataGridLengthUnitType.Star); } protected override void OnAttached() { base.OnAttached(); AssociatedObject.Width = new DataGridLength(Width, DataGridLengthUnitType.Star); } } }