2013-06-14 15 views
6

Mam DataGrid, gdzie SelectedItem jest związany z właściwością VM Selected. Mam kontrolę wyszukiwania, która zrobi znalezisko i SelectedItem ze zmian (i przewija do widoku). WPF 4.0 i DataGridSelectionUnit="FullRow".Skoncentruj się na DataGridCell dla SelectedItem, gdy DataGrid otrzymuje Focus ostrości

Mój problem dotyczy ostrości. DataGrid odbiera ostrość (poprzez dołączony nieruchomość/wiązanie), ale nie można używać Up, dół, Page Up, klawiszy Page Down zmienić wiersze (SelectedItem). Jeśli ponownie zaznaczę zakładkę, wybrana zostanie pierwsza komórka pierwszego wyświetlanego wiersza, która zmienia wartość SelectedItem.

Podsumowując, w jaki sposób ustawić ostrość klawiatury na DataGridCell dla SelectedItem, gdy kamera DataGrid otrzymuje ostrość?

Jest tak wiele pytań DataGrid/Focus i wypróbowano już kilka rzeczy. Dzięki za pomoc.

Odpowiedz

7

Musisz podać nowo wybrany rząd logicznego fokusa. Po wybraniu nowego elementu spróbować wymienić rozmowy SetFocus z tym:

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

Pracował doskonale! Umieść to w procedurze obsługi zdarzeń GotKeyboardFocus i wywołaj tylko, jeśli e.NewFocus jest DataGrid. – KornMuffin

+0

@KornMuffin używasz go w WPF kopalnia nie działa właśnie chcę skupić się na moim datagrid, że klawisze strzałek działają, ale nie działa żadne rozwiązanie proszę – Ahmad

+0

@Ahmad Tak, WPF. Moje DataGrid.SelectionUnit jest FullRow. Nie jestem pewien, czy to coś dla ciebie zmieni, czy nie. – KornMuffin

0

Ten PowerShell snippet pracował dla mnie:

$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

Rozwiązanie FocusManager nie działa na mnie z jakiegoś powodu. Również wymagałem bardziej ogólnej aplikacji. Więc tutaj jest to, co wymyśliłem:

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(); 
     } 
    } 
} 

i nazwać tak:

MyDataGrid.IsKeyboardFocusWithinChanged += (sender, e) => 
{ 
    if ((bool)e.NewValue == true) 
    { 
     Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Loaded, new Action(() => 
     { 
      MyDataGrid.RestoreFocus(scrollIntoView: true); 
     })); 
    } 
};