আমি এই পরামর্শগুলি এবং অন্যান্য সাইটগুলিতে প্রচুর পরিমাণে খুঁজে পেয়েছি, কিন্তু সেগুলির কোনওোটাই আমার পক্ষে যথেষ্ট কাজ করেন নি। শেষ পর্যন্ত আমি নিম্নলিখিত সমাধানটি তৈরি করেছিলাম।
আমি আমার নিজস্ব ডেটাগ্রিড-উত্তরাধিকারসূত্রে নিয়ন্ত্রণ তৈরি করেছি এবং কেবল এই কোডটিতে এটি যুক্ত করেছি:
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;
}
}
এই সব কি করে?
ঠিক আছে, প্রতিবার আমরা আমাদের ডেটাগ্রিডের যে কোনও ঘরে ক্লিক করি, তখন আমরা দেখতে পাই যে ঘরে কোষের মধ্যে একটি চেকবক্স নিয়ন্ত্রণ রয়েছে কিনা। যদি তা হয় , তবে আমরা সেই চেকবক্সে ফোকাস সেট করব এবং এর মান টগল করব ।
এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে এবং এটি একটি দুর্দান্ত, সহজেই পুনরায় ব্যবহারযোগ্য সমাধান।
এটা তোলে হতাশ যে আমরা হয় প্রয়োজন এই যদিও করতে লেখ কোডে। ডাব্লুপিএফ এটিকে সারিটি সম্পাদনা মোডে রাখার জন্য ব্যবহার করার সাথে সাথে প্রথম মাউস ক্লিক (একটি ডেটাগ্রিডের চেকবক্সে) "উপেক্ষা করা হয়েছে" ব্যাখ্যাটি বাস্তবসম্মত অ্যাপ্লিকেশনটি যেভাবে কাজ করে তার বিপরীতে।
যদি কোনও ব্যবহারকারী তাদের স্ক্রিনে একটি চেকবক্স দেখতে পান তবে এটি একবার এটি টিক / আনটিক করতে ক্লিক করতে সক্ষম হন। গল্পের শেষে.