ฉันได้ลองใช้คำแนะนำเหล่านี้และอื่น ๆ อีกมากมายที่ฉันได้พบในไซต์อื่น ๆ แต่ไม่มีข้อใดที่เหมาะกับฉัน ในที่สุดฉันสร้างโซลูชันต่อไปนี้
ฉันได้สร้างตัวควบคุมที่สืบทอดมาจาก 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 ของเราเราจะดูว่าเซลล์นั้นมีตัวควบคุมกล่องกาเครื่องหมายอยู่ภายในหรือไม่ ถ้ามันไม่ได้แล้วเราจะตั้งโฟกัสไปที่กล่องกาเครื่องหมายที่และสลับค่าของมัน
ดูเหมือนว่าจะใช้งานได้สำหรับฉันและเป็นโซลูชันที่นำกลับมาใช้ใหม่ได้อย่างง่ายดาย
มันน่าผิดหวังที่เราต้องเขียนโค้ดเพื่อทำสิ่งนี้ คำอธิบายว่าการคลิกเมาส์ครั้งแรก (บนกล่องกาเครื่องหมายของ DataGrid) คือ "ละเว้น" เนื่องจาก WPF ใช้เพื่อทำให้แถวเข้าสู่โหมดแก้ไขอาจฟังดูมีเหตุผล แต่ในโลกแห่งความเป็นจริง
หากผู้ใช้เห็นช่องทำเครื่องหมายบนหน้าจอผู้ใช้ควรคลิกเลือกหนึ่งครั้งเพื่อทำเครื่องหมาย / ยกเลิกการเลือก ตอนจบของเรื่อง.