Search code examples
c#wpfdatagridreadonlyelementstyle

DataGridCheckBoxColumn loses IsReadOnly state when applying ElementStyle


I need to vertically center a DataGridCheckBoxColumn. Since I did not find a Property inside DataGridCheckBoxColumn, I applied an ElementStyle. However, when this style is applied, my CheckBox becomes checkable again, although it is set to ReadOnly in my DataGrid (the whole Datagrid is ReadOnly), and in DataGridCheckBoxColumn itself.

How can I create a vertically centered CheckBox that keeps its ReadOnly state? Here is my code:

<DataGrid IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Header="Test" IsReadOnly="True" Binding="{Binding MyBinding}">                        
            <DataGridCheckBoxColumn.ElementStyle>
                <Style>
                    <Setter Property="FrameworkElement.Margin" Value="0,1,0,0" />
                    <Setter Property="FrameworkElement.VerticalAlignment" Value="Center" />
                    <Setter Property="FrameworkElement.HorizontalAlignment" Value="Center" />                                
                </Style>
            </DataGridCheckBoxColumn.ElementStyle>
        </DataGridCheckBoxColumn>
    </DataGrid.Columns>
</DataGrid>

Solution

  • When you set ElementStyle on the DataGridCheckBoxColumn you should include FrameworkElement.IsHitTestVisible="False" to your Style:

    <Setter Property="FrameworkElement.IsHitTestVisible" Value="False"/>
    

    Also if you add TargetType="CheckBox" to the Style then you don't have to repeat FrameworkElement for each Setter anymore:

    <DataGridCheckBoxColumn.ElementStyle>
        <Style TargetType="CheckBox">
            <Setter Property="Margin" Value="0,1,0,0" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="HorizontalAlignment" Value="Center" />
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>
    </DataGridCheckBoxColumn.ElementStyle>