Saya sudah mencoba saran-saran ini, dan banyak yang lain yang saya temukan di situs lain, tetapi tidak ada yang bekerja untuk saya. Pada akhirnya, saya menciptakan solusi berikut.
Saya telah membuat kontrol yang diwarisi DataGrid saya sendiri, dan cukup menambahkan kode ini ke dalamnya:
public class DataGridWithNavigation : Microsoft.Windows.Controls.DataGrid
{
public DataGridWithNavigation()
{
EventManager.RegisterClassHandler(typeof(DataGridCell),
DataGridCell.PreviewMouseLeftButtonDownEvent,
new RoutedEventHandler(this.OnPreviewMouseLeftButtonDown));
}
private void OnPreviewMouseLeftButtonDown(object sender, RoutedEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
{
DependencyObject obj = FindFirstControlInChildren(cell, "CheckBox");
if (obj != null)
{
System.Windows.Controls.CheckBox cb = (System.Windows.Controls.CheckBox)obj;
cb.Focus();
cb.IsChecked = !cb.IsChecked;
}
}
}
public DependencyObject FindFirstControlInChildren(DependencyObject obj, string controlType)
{
if (obj == null)
return null;
// Get a list of all occurrences of a particular type of control (eg "CheckBox")
IEnumerable<DependencyObject> ctrls = FindInVisualTreeDown(obj, controlType);
if (ctrls.Count() == 0)
return null;
return ctrls.First();
}
public IEnumerable<DependencyObject> FindInVisualTreeDown(DependencyObject obj, string type)
{
if (obj != null)
{
if (obj.GetType().ToString().EndsWith(type))
{
yield return obj;
}
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
foreach (var child in FindInVisualTreeDown(VisualTreeHelper.GetChild(obj, i), type))
{
if (child != null)
{
yield return child;
}
}
}
}
yield break;
}
}
Apa yang dilakukan semua ini?
Nah, setiap kali kita mengklik sel mana pun di DataGrid kita, kita melihat apakah sel itu berisi kontrol kotak centang di dalamnya. Jika tidak , maka kita akan mengatur fokus ke yang kotak centang dan beralih nilai itu .
Ini sepertinya bekerja untuk saya, dan merupakan solusi yang bagus dan mudah digunakan kembali.
Sangat mengecewakan bahwa kita perlu menulis kode untuk melakukan ini. Penjelasan bahwa klik mouse pertama (pada kotak centang DataGrid) "diabaikan" karena WPF menggunakannya untuk memasukkan baris ke mode Edit mungkin terdengar logis, tetapi di dunia nyata, ini bertentangan dengan cara setiap aplikasi nyata bekerja.
Jika pengguna melihat kotak centang di layar mereka, mereka harus dapat mengkliknya sekali untuk mencentang / menghapusnya. Akhir dari cerita.