Bu önerileri denedim ve diğer sitelerde bulduğum pek çok şey var, ancak bunların hiçbiri benim için çalıştı. Sonunda, aşağıdaki çözümü yarattım.
Kendi DataGrid devralınmış denetimimi oluşturdum ve sadece bu kodu ekledim:
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;
}
}
Bütün bunlar ne yapıyor?
DataGrid'imizdeki herhangi bir hücreye her tıkladığımızda, hücrenin içinde bir CheckBox denetimi olup olmadığını görürüz. O takdirde yapar , o zaman o CheckBox odağı oluştururuz ve 's değeri geçiş .
Bu benim için çalışıyor gibi görünüyor ve güzel, kolayca yeniden kullanılabilir bir çözüm.
Bunu yapmak için kod yazmamız gerektiği hayal kırıklığı yaratıyor . WPF satırı Düzenleme moduna koymak için kullandığı için ilk fare tıklamasının (DataGrid'in CheckBox'unda) "yoksayıldığı" açıklaması mantıklı gelebilir, ancak gerçek dünyada bu, her gerçek uygulamanın çalışma biçimine aykırıdır.
Bir kullanıcı ekranında bir onay kutusu görürse, işaretlemek / işaretini kaldırmak için bir kez tıklayabilmelidir. Hikayenin sonu.