Create style for TextBlock in DataGridTextColumn

datagrid, datagridtextcolumn, styles, wpf

Solution

You can define a `CellStyle` as below:

<Style x:Key="DataGridCellStyle" TargetType="DataGridCell">
    <Setter Property="FocusVisualStyle" Value="{x:Null}" />
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Grid Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

And assign it to the DataGrid: `CellStyle="{StaticResource DataGridCellStyle}"`. In this way all your cells will have content centered.

EDIT: The above code is from one of my projects and also contains the code to remove grid lines in the DataGrid. You can get them back by changing `Grid` to `Border` in the template. Like this:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type DataGridCell}">
            <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

Problem

I want to create a global style that sets the `VerticalAlignment` to `Center` for all `TextBlock` controls inside a `DataGrid` or inside a `DataGridTextColumn`. I don't want to copy the following into every `DataGridTextColumn` because it feels repetitive. ``` <DataGridTextColumn Header="Some Property" Binding="{Binding SomeProperty}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="VerticalAlignment" Value="Center"></Setter> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> ``` I tried something like the following but it doesn't work because `DataGridTextColumn` does not inherit from `FrameworkElement` or `FrameworkContentElement`. `DataGrid` itself does but any further wrapping I try leads to errors: ``` <Style TargetType="DataGridTextColumn"> <Setter Property="ElementStyle"> <Setter.Value> <Style TargetType="TextBlock"> <Setter Property="VerticalAlignment" Value="Center"/> </Style> </Setter.Value> </Setter> </Style> ```

Original source