2013-06-14 18 views
6

SelectedItem'un bir VM Selected özelliğine bağlı olduğu bir DataGrid var. Bulmak ve SelectedItemDataGrid değişikliklerini (ve görünümüne kaydırır) yapacak bir arama denetimi var. WPF 4.0 ve DataGridSelectionUnit="FullRow".DataGrid, Klavye Odağı Aldığında SelectedItem için DataGridCell'e odaklanın

Sorunum odak noktası. DataGrid odağı aldığında (vasıtasıyla bağlı özellik/bağlanma) ancak Page Up, Page Down tuşları, Yukarı, Aşağı satırları değiştirmek için (SelectedItem) kullanamaz. Tekrar sekme yaparsam, görüntülenen ilk sıranın ilk hücresi seçilir ve bu SelectedItem'u değiştirir.

DataGrid odağı aldığında, SelectedItem için DataGridCell klavye odağı nasıl klavye odağı verebilirim?

Çok fazla DataGrid/Focus soruları var ve zaten birkaç şeyi denedim. Yardım ettiğin için teşekkür ederim.

cevap

7

Yeni seçilen satır mantıksal odağını vermeniz gerekiyor. Yeni öğe seçildikten sonra bu ile SetFocus çağrıyı değiştirmeyi deneyin:

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

mükemmel çalıştı! Bunu GotKeyboardFocus olay işleyicisine koyun ve sadece e.NewFocus DataGrid ise bunu çağırır. – KornMuffin

+0

@KornMuffin WPF'de çalışıyorum mayın çalışmıyor sadece ok tuşlarının çalıştığı datagrid'ime odaklanmak istiyorum ama herhangi bir çözüm çalışmıyor lütfen – Ahmad

+0

@Ahmad Yes, WPF. DataGrid.SelectionUnit, FullRow'tur. Bunun sizin için fark yaratıp yaratmayacağından emin değilsiniz. – KornMuffin

0

Bu PowerShell benim için çalıştı snippet'ine:

$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 çözümü nedense benim için çalışmadı. Ayrıca daha genel bir görüşe ihtiyacım vardı. Yani burada deyişle, ben ile geldi:

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

Ve böyle diyoruz:

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