8

VM Selected プロパティにバインドされているDataGrid場所があります。SelectedItem私は検索と変更を行う検索コントロールを持っていSelectedItemますDataGrid(そしてスクロールして表示します)。WPF 4.0 およびDataGrid SelectionUnit="FullRow".

私の問題は焦点にあります。は(添付プロパティ/バインディングを介して) フォーカスを受け取りますが、、、キーを使用して行を変更DataGridすることはできません( )。もう一度タブを押すと、表示されている最初の行の最初のセルが選択され、.UpDownPage UpPage DownSelectedItemSelectedItem

結論として、 がフォーカスを受け取っDataGridCellSelectedItemときにキーボード フォーカスを に与えるにはどうすればよいですか?DataGrid

非常に多くのDataGrid/Focus質問があり、すでにいくつかのことを試しました. ご協力いただきありがとうございます。

4

3 に答える 3

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 に答える