我在数据网格中调整了一些行为。维护“模板”列中的复选框,并从视图模型中绑定集合。基于此属性,我想更新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;
}
}
答案 0 :(得分:0)
我相信当您单击某个项目时,它会被取消选中,从而触发未经检查的事件。然后,selectionchanged事件会再次检查项目,从而触发已检查的事件。这可能发生得如此之快,以至于您无法判断项目是否未被检查,除了正在触发的事件
答案 1 :(得分:0)
我检查了你的场景,发现当你在DataGridSelection更改事件中设置IsSelected项为true时,datagrid行上的当前单击复选框被聚焦,该特定行中复选框的IsChecked属性被设置为true。因此,您尝试检查相同的复选框,这些状态将取消选中,然后从框架调用UnChecked事件。这是正确的行为。
您可以通过在复选框选中的事件中将焦点设置为datagrid来实现您的要求。