wpfdatagridwpfdatagriddatagridtemplatecolumn

Datagrid (WPF) Column styling programmatically (not xaml)


I have looked on SO but haven't found an exact answer to what I am looking for. I have a DataGrid view bound to a data source. I want to style columns programmatically after the window with the datagrid is visible. I also want to change it from time to time based on some behavior.

I tried to use the DataGridTemplateColumn but whenever it runs it deletes the data from those columns. Also I don't get the Cell Style when I try to get it from Resources (i.e. its always null)

        private void StyleColumns()
    {
        // Replace the DueDate column with a custom template column.
        for (int i = 0; i < 7; i += 2)
        {
            // Create a new template column.
            DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
            templateColumn.Header = m_DataGrid.Columns[i].Header;
            Style style = new Style();
            templateColumn.CellStyle = (Style)Resources["ColumnGone"];
            // ...
            // Replace the auto-generated column with the templateColumn.
            m_DataGrid.Columns[i] = templateColumn;
        }
    }

XAML is like this

                        <DataGrid AutoGenerateColumns="True" x:Name="m_grfFileDataGrid" ItemsSource="{Binding cb.GRF}"
                              RowHeight="20" ColumnWidth="*"
                              AlternatingRowBackground="Beige"
                              SelectionUnit="CellOrRowHeader"
                              FontFamily="Consolas"
                              FontSize="12"
                              CanUserReorderColumns="False"
                              CanUserSortColumns="False"
                              CanUserAddRows="False"
                              CanUserDeleteRows="False">
                        <DataGrid.Resources>
                            <Style TargetType="DataGridCell" x:Key="ColumnGone">
                                <Setter Property="Background" Value="SeaGreen"/>
                            </Style>
                            <Style x:Key="DisabledColumn">
                                <Setter Property="DataGridColumn.CanUserResize"
                                        Value="False" />
                                <Setter Property="DataGridColumn.CanUserSort"
                                        Value="False" />
                                <Setter Property="DataGridColumn.CanUserReorder"
                                        Value="False" />
                                <Setter Property="DataGridColumn.CellStyle"
                                        Value="{StaticResource ColumnGone}" />
                            </Style>
                        </DataGrid.Resources>
                    </DataGrid>

Any help on this would be appreciated. thanks


Solution

  • Here's an example of adding a column with Style:

    XAML

    <Grid>
        <DataGrid x:Name="m_DataGrid" Width="400" 
                              AutoGenerateColumns="True"
                              HorizontalAlignment="Left"
                              RowHeight="20" ColumnWidth="*"
                              AlternatingRowBackground="Beige"
                              SelectionUnit="CellOrRowHeader"
                              FontFamily="Consolas"
                              FontSize="12"
                              CanUserReorderColumns="False"
                              CanUserSortColumns="False"
                              CanUserAddRows="False"
                              CanUserDeleteRows="False">
                                    
            <DataGrid.Resources>
                <Style TargetType="DataGridCell" x:Key="ColumnGone">
                    <Setter Property="Background" Value="SeaGreen" />
                    <Setter Property="Foreground" Value="White" />
                </Style>
    
                <Style x:Key="DisabledColumn">
                    <Setter Property="DataGridColumn.CanUserResize"
                                        Value="False" />
                    <Setter Property="DataGridColumn.CanUserSort"
                                        Value="False" />
                    <Setter Property="DataGridColumn.CanUserReorder"
                                        Value="False" />
                    <Setter Property="DataGridColumn.CellStyle"
                                        Value="{StaticResource ColumnGone}" />
                </Style>
            </DataGrid.Resources>
        </DataGrid>
    
        <Button Name="AddColumn" Content="AddColumn" Width="100" Height="30" HorizontalAlignment="Right" Click="AddColumn_Click" />
    </Grid>
    

    Code behind

    public class Person
    {
        public string Sample { get; set; }
    }
    
    private ObservableCollection<Person> TestCollection = new ObservableCollection<Person>();
    
    public MainWindow()
    {
        InitializeComponent();
    
        TestCollection.Add(new Person() { Sample = "Orange"});
        TestCollection.Add(new Person() { Sample = "White"});
        TestCollection.Add(new Person() { Sample = "Green"});
    
        m_DataGrid.ItemsSource = TestCollection;
    }
    
    private void StyleColumns()
    {            
        DataGridTextColumn MyColumn = new DataGridTextColumn();
        MyColumn.Header = "Test";
        MyColumn.Binding = new Binding("Sample");
    
        Style style = (Style)m_DataGrid.Resources["ColumnGone"];
        MyColumn.CellStyle = style;           
        m_DataGrid.Columns.Add(MyColumn);
    }
    
    private void AddColumn_Click(object sender, RoutedEventArgs e)
    {
        StyleColumns();
    }
    

    Most likely, you do not pointed Binding for the new column.

    Alternatively, set the Style for an existing column:

    Specify the name of the column:

    <DataGridTextColumn x:Name="MySuperColumn" Header="MyColumn" Binding="{Binding Path=Sample}" Width="100" />
    

    Set the Style in code:

    MySuperColumn.CellStyle = style;