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);
        }
    }

}

 

posted @ 2025-05-31 19:37  FredGrit  阅读(10)  评论(0)    收藏  举报