Я попробовал эти предложения и множество других, которые я нашел на других сайтах, но ни одно из них мне не помогло. В итоге я создал следующее решение.
Я создал свой собственный элемент управления, унаследованный от DataGrid, и просто добавил к нему следующий код:
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;
}
}
Что все это делает?
Что ж, каждый раз, когда мы щелкаем по любой ячейке в нашей DataGrid, мы видим, содержит ли ячейка элемент управления CheckBox. Если это делает , тогда мы установим фокус на этот CheckBox и переключим его значение .
Кажется, это работает для меня и является хорошим, легко используемым решением.
К сожалению, нам нужен для написания кода, чтобы сделать это. Объяснение того, что первый щелчок мыши (на CheckBox в DataGrid) «игнорируется», поскольку WPF использует его для перевода строки в режим редактирования, может показаться логичным, но в реальном мире это противоречит принципу работы любого реального приложения. 1018 *
Если пользователь видит флажок на своем экране, он должен иметь возможность щелкнуть по нему один раз, чтобы поставить / снять галочку. Конец истории.