DataGridCheckBoxColumn loses IsReadOnly state when applying ElementStyle

后端 未结 2 1471
孤街浪徒
孤街浪徒 2021-01-18 08:01

I need to vertically center a DataGridCheckBoxColumn. Since I did not find a Property inside DataGridCheckBoxColumn, I applied an ElementStyl

相关标签:
2条回答
  • 2021-01-18 08:37

    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>
    
    0 讨论(0)
  • 2021-01-18 08:39

    I have a suspicion that this is a bug (as it doesn't happen on other column types).

    To work around it, all you need to do is make sure you base your style on the default style; by adding BasedOn="{x:Static DataGridCheckBoxColumn.DefaultElementStyle}" to the Style element:

    <DataGrid IsReadOnly="True">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Header="Test" IsReadOnly="True" Binding="{Binding MyBinding}">
                <DataGridCheckBoxColumn.ElementStyle>
                    <Style BasedOn="{x:Static DataGridCheckBoxColumn.DefaultElementStyle}">
                        <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>
    

    This approach has the advantage that you don't have to do lots of work if you are intending on changing the DataGrid.IsReadOnly property at runtime.

    0 讨论(0)
提交回复
热议问题