मैंने इन सुझावों की कोशिश की है, और बहुत से अन्य मैंने अन्य साइटों पर पाए हैं, लेकिन उनमें से कोई भी मेरे लिए बहुत काम नहीं करता है। अंत में, मैंने निम्नलिखित समाधान बनाया।
मैंने अपना खुद का डेटाग्रिड-इनहेरिटेड कंट्रोल बनाया है, और बस इस कोड को इसमें जोड़ा है:
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;
}
}
यह सब क्या करता है?
खैर, हर बार जब हम अपने डेटाग्रिड में किसी सेल पर क्लिक करते हैं, तो हम देखते हैं कि सेल में चेकबॉक्स नियंत्रण है या नहीं। यदि ऐसा होता है , तो हम उस चेकबॉक्स पर ध्यान केंद्रित करेंगे और उसके मूल्य को टॉगल करेंगे ।
यह मेरे लिए काम करने लगता है, और एक अच्छा, आसानी से पुन: प्रयोज्य समाधान है।
यह निराशाजनक है कि हमें ऐसा करने के लिए कोड लिखने की आवश्यकता है। पहला माउस क्लिक (एक डेटाग्रिड के चेकबॉक्स पर) की व्याख्या "अनदेखा" की जाती है, क्योंकि WPF इसे पंक्ति को एडिट मोड में डालने के लिए उपयोग करता है, यह तार्किक लग सकता है, लेकिन वास्तविक दुनिया में, यह हर वास्तविक एप्लिकेशन के काम करने के तरीके के खिलाफ जाता है।
यदि कोई उपयोगकर्ता अपनी स्क्रीन पर एक चेकबॉक्स देखता है, तो उसे टिक / अनटिक करने के लिए एक बार उस पर क्लिक करने में सक्षम होना चाहिए। कहानी का अंत।