复选框行为未正确使用DataGridTemplateColumn?

时间:2018-04-04 09:04:41

标签: wpf datagrid

我在数据网格中调整了一些行为。维护“模板”列中的复选框,并从视图模型中绑定集合。基于此属性,我想更新DataGridRow的Background和foreground属性。在此尝试复选框在第一次单击时未正确更新。不必要地触发取消选中事件以破坏此行为。我怎样才能克服这个问题。

<DataGrid Name="dataGrid" PreviewKeyDown="dataGrid_KeyDown"   Margin="5"  HeadersVisibility="None" IsReadOnly="True" AutoGenerateColumns="False" CanUserAddRows="False" GridLinesVisibility="None"
          SelectionMode="Extended"  Height="465"  BorderThickness="0" FontSize="14" FontFamily="Book Antiqua" FontWeight="Bold" RowHeight="25" ColumnWidth="*" >
    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <Setter Property="Height" Value="25"/>
            <Setter Property="FontSize" Value="14"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected,UpdateSourceTrigger=PropertyChanged}" Value="true">
                    <Setter Property="Foreground" Value="#EDFFF9"></Setter>
                    <Setter Property="Background" Value="#0078D7"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    <DataGrid.Columns>
        <DataGridTemplateColumn  Width="30">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox x:Name="ledgerSelectedChk" Checked="ledgerSelectedChk_Checked_1" Unchecked="ledgerSelectedChk_Unchecked" Click="ledgerSelectedChk_Checked" BorderThickness="1" IsChecked="{Binding IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" VerticalAlignment="Center"  />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

C#

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //if I comment this means all are working properly
    foreach (var item in dataGrid.SelectedItems)
    {
        (item as OrderInfo).IsSelected = true;
    }
}

2 个答案:

答案 0 :(得分:0)

我相信当您单击某个项目时,它会被取消选中,从而触发未经检查的事件。然后,selectionchanged事件会再次检查项目,从而触发已检查的事件。这可能发生得如此之快,以至于您无法判断项目是否未被检查,除了正在触发的事件

答案 1 :(得分:0)

我检查了你的场景,发现当你在DataGridSelection更改事件中设置IsSelected项为true时,datagrid行上的当前单击复选框被聚焦,该特定行中复选框的IsChecked属性被设置为true。因此,您尝试检查相同的复选框,这些状态将取消选中,然后从框架调用UnChecked事件。这是正确的行为。

您可以通过在复选框选中的事件中将焦点设置为datagrid来实现您的要求。