8

我有一个绑定到 VM Selected 属性的DataGrid位置。SelectedItem我有一个搜索控件,它将进行查找和SelectedItem更改DataGrid(并滚动到视图中)。WPF 4.0 和DataGrid SelectionUnit="FullRow".

我的问题是焦点。接收焦点(通过DataGrid附加属性/绑定),但您不能使用Up, Down, Page Up,Page Down键更改行 ( SelectedItem)。如果我再次制表符,则选择显示的第一行的第一个单元格,这会更改SelectedItem.

DataGridCell底线,SelectedItemDataGrid接收焦点时,如何将键盘焦点赋予?

有很多DataGrid/Focus问题,并且已经尝试了一些事情。谢谢你的帮助。

4

3 回答 3

9

您需要为新选择的行提供逻辑焦点。选择新项目后,尝试将您的SetFocus呼叫替换为:

        var selectedRow = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(dataGrid1.SelectedIndex);
        FocusManager.SetIsFocusScope(selectedRow, true);
        FocusManager.SetFocusedElement(selectedRow, selectedRow);
于 2013-06-15T20:36:57.637 回答
0

这个 PowerShell 片段对我有用:

$dataGrid = ...    
$dataGrid.add_GotKeyboardFocus({
    param($Sender,$EventArgs)
    if ($EventArgs.OldFocus -isnot [System.Windows.Controls.DataGridCell) {
        $row = $dataGrid.ItemContainerGenerator.ContainerFromIndex($dataGrid.SelectedIndex)
        $row.MoveFocus((New-Object System.Windows.Input.TraversalRequest("Next")))
    }
})
于 2016-10-15T07:47:08.407 回答
0

由于某种原因,FocusManager 解决方案对我不起作用。我还需要一个更通用的方法。所以这就是我想出的:

using System.Windows.Controls;

public static void RestoreFocus(this DataGrid dataGrid,
                                     int column = 0, bool scrollIntoView = false)
{
    if (dataGrid.IsKeyboardFocusWithin && dataGrid.SelectedItem != null)
    {
        // make sure everything is up to date
        dataGrid.UpdateLayout();

        if (scrollIntoView)
        {
            dataGrid.ScrollIntoView(dataGrid.SelectedItem);
        }

        var cellcontent = dataGrid.Columns[column].GetCellContent(dataGrid.SelectedItem);
        var cell = cellcontent?.Parent as DataGridCell;
        if (cell != null)
        {
            cell.Focus();
        }
    }
}

并这样称呼它:

MyDataGrid.IsKeyboardFocusWithinChanged += (sender, e) =>
{
    if ((bool)e.NewValue == true)
    {
        Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Loaded, new Action(() =>
        {
            MyDataGrid.RestoreFocus(scrollIntoView: true);
        }));
    }
};
于 2016-10-28T10:34:44.207 回答