在DataGrid上使用ScrollIntoView和Checkbox更改行为

时间:2011-10-25 01:03:56

标签: wpf wpfdatagrid

我似乎有相互矛盾的要求。我有一个DataGrid,它有一个复选框作为第一列。用户希望只需单击一下即可选中复选框,而不是双击。我能够通过使用DataGridTemplateColumn和这样的复选框来实现这一点:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox  IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

用户还可以使用一个控件来指定一行(可以有数百行)。如果他们指定了一个不在视图中的行,我希望它滚动到视图中。我妥协并在DataGrid_SelectionChanged事件的代码中添加了一个事件处理程序。最初我只是使用ScrollIntoView命令,但是屏幕外的行会突出显示,但网格没有将它们滚动到视图中。然后,我可以添加一个Focus命令,并将该行滚动到视图中。所以现在事件处理程序看起来像这样:

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   DataGrid dg = (DataGrid)sender;
   if (dg.SelectedItem == null) return;
   dg.ScrollIntoView(dg.SelectedItem);
   dg.SelectedItem.Focus();
}

现在我回到原来的问题,行滚动到视图但是要检查任何其他行上的复选框(您没有通过跳转到行控件进入),您必须单击两次。有人知道是什么原因导致行动移动到需要双击?

1 个答案:

答案 0 :(得分:0)

好吧,我得到了以下代码的工作,这些代码的灵感来自一些相关的关于将重点放在单元格中的帖子。我不知道为什么ScrollIntoView无法工作,工作或为什么执行最后三行是我可以让行滚动到视图而不禁用复选框的一种方式。

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    DataGrid dg = (DataGrid)sender;
    if (dg.SelectedItem == null) return;
    dg.ScrollIntoView(dg.SelectedItem);

    DataGridRow dg_row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem);
    if (dg_row == null) return;
    dg_row.Focus();
    }