2013-06-14 1 views
6

私はDataGridを持っていますが、SelectedItemはVM Selectedプロパティにバインドされています。私は検索を行い、DataGridSelectedItemの変更を(そしてスクロールする)検索コントロールを持っています。 WPF 4.0およびDataGridSelectionUnit="FullRow"DataGridがキーボードフォーカスを受け取ったときのSelectedItemのDataGridCellを中心に

私の問題は焦点にあります。 DataGridがフォーカスを受け取る(経由で添付プロパティ/バインディング)が、あなたはページアップPage Downキーキー、まで、ダウン行を変更する(SelectedItem)を使用することはできません。もう一度タブを押すと、表示されている最初の行の最初のセルが選択され、SelectedItemが変更されます。

要点DataGridがフォーカスを受け取ったときに、SelectedItemのキーボードフォーカスをDataGridCellに与えるにはどうすればよいですか?

DataGrid/Focusという質問がたくさんあり、すでにいくつか試してみました。ご協力いただきありがとうございます。

答えて

7

新たに選択した行に論理フォーカスを付ける必要があります。新しい項目を選択したらこれであなたのSetFocusコールを交換してください:

 var selectedRow = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(dataGrid1.SelectedIndex); 
     FocusManager.SetIsFocusScope(selectedRow, true); 
     FocusManager.SetFocusedElement(selectedRow, selectedRow); 
+0

だからここに私が思い付いたです!これをGotKeyboardFocusイベントハンドラに入れ、e.NewFocusがDataGridである場合にのみ呼び出します。 – KornMuffin

+0

@KornMuffin WPFでそれを使用しています鉱山は機能していません私はちょうど矢印キーが動作する私のDataGridに焦点を当てたいですが、どの解決策も働かないでください – Ahmad

+0

@Ahmadはい、WPF。私のDataGrid.SelectionUnitはFullRowです。それがあなたに影響を与えるかどうかは分かりません。 – KornMuffin

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"))) 
    } 
}) 
0

をするFocusManagerソリューションが何らかの理由で私のために動作しませんでした。また、私はより一般的なapporachが必要でした。

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); 
     })); 
    } 
}; 
関連する問題