wpf在CurrentCellChanged事件处理程序中更改单元格选择不起作用

时间:2015-07-28 08:35:46

标签: wpf datagrid selection cell

我有一个wpf数据网格,其中SelectionUnit设置为“CellOrRowHeader”,SelectionMode设置为“Extended”。

<DataGrid SelectionUnit="Cell"  SelectionMode="Extended" Name="myDataGrid">
    CurrentCellChanged="onCurrentCellChanged" 
</DataGrid>

在onCurrentCellChanged中我尝试将选择更改为另一个单元格:

private void onCurrentCellChanged(object sender, EventArgs e)
{
    DataGridCell cell = DataGridHelper.GetCell(myDataGrid, 3, 3);
    cell.IsSelected = true;
    cell.Focus();
}

GetCell是一个辅助函数。我验证了单元格不为空,并执行代码。但是,我只看到单元格{3,3}被聚焦(带有黑色边框),但没有突出显示(没有蓝色背景)。

奇怪的是,如果我调用相同的代码,而不是调用onCurrentCellChanged事件回调,则单元格{3,3}会突出显示。

有人知道原因吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

除了&#34; CurrentCellChanged&#34;,还有另一个事件&#34; SelectedCellsChanged&#34;行为不同。经过一些测试,我发现这两个事件有不同的用途。例如,在某些情况下,&#34; CurrentCellChanged&#34;即使选择未更改,也会被调用。虽然这超出了这个答案的范围......

回到主题,我设法通过操纵SelectedCellsChanged事件回调中的单元格选择来解决问题。但有一些技巧:

更改标记:

<DataGrid SelectionUnit="Cell"  SelectionMode="Extended" Name="myDataGrid">
    SelectedCellsChanged="onSelectedCellsChanged" 
</DataGrid>

这是处理程序:

private void onSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    // trick: Since the code below change the cell selection, which may
    // cause this handler to be called recursively, I need to do some filter
    // If myDataGrid.CurrentCell != e.AddedCells.First(), return

    // Here we can change cell selection
    DataGridCell cell = DataGridHelper.GetCell(myDataGrid, 3, 3);
    cell.IsSelected = true;
}