مشكلة في اجتياز شجرة عنصر WPF
-
29-09-2019 - |
سؤال
انا املك ListBox
البيانات المرتبطة بجمع بلدي PersonCollection
صف دراسي. بعد ذلك ، لقد حددت قالب بيانات لكائنات النوع Person
, ، يتألف من أ DockPanel
الذي يحتوي على أ TextBlock
لاسم الشخص و Button
لإزالة الشخص من القائمة. يبدو لطيفًا جدًا معًا.
المشكلة التي أواجهها هي أنني غير قادر على الوصول إلى العنصر المحدد (وحذفه) في مربع القائمة عند النقر فوق الزر المحدد في قالب البيانات. هذا هو معالج الزر:
private void RemovePersonButton_Click(object sender, RoutedEventArgs e)
{
Button clickedButton = (Button)e.Source;
DockPanel buttonPanel = (DockPanel)clickedButton.Parent;
Control control = (Control)button.Parent;
}
كائن آخر تم إنشاؤه control
هو null
, ، أي لا يمكنني التقدم إلى أعلى شجرة العناصر ، لذلك لا يمكنني الوصول إلى القائمة و SelectedItem
. الشيء المهم الذي يجب ملاحظته هنا هو أنه لا يمكن ببساطة الذهاب مع الحصول على العنصر المحدد من القائمة عن طريق الاتصال به ، لأن لدي أكثر من قائمة في النافذة وكل تلك القوائم تنفذ نفس قالب البيانات ، أي مشاركة معالج الحدث نفسه لـ زر حذف.
وسأقدر كل المساعدة التي يمكنني الحصول عليها. شكرًا.
المحلول
إذا فهمت السؤال بشكل صحيح ، أعتقد أنك ستتمكن من الحصول على الشخص من DataContext للزر
private void RemovePersonButton_Click(object sender, RoutedEventArgs e)
{
Button clickedButton = (Button)e.Source;
Person selectedItem = clickedButton.DataContext as Person;
if (selectedItem != null)
{
PersonCollection.Remove(selectedItem);
}
}
هناك طريقة أخرى هي العثور على listbox في VisualTree
private void RemovePersonButton_Click(object sender, RoutedEventArgs e)
{
Button clickedButton = (Button)e.Source;
ListBox listBoxParent = GetVisualParent<ListBox>(clickedButton );
Person selectedItem = listBoxParent.SelectedItem as Person;
//...
}
public T GetVisualParent<T>(object childObject) where T : Visual
{
DependencyObject child = childObject as DependencyObject;
while ((child != null) && !(child is T))
{
child = VisualTreeHelper.GetParent(child);
}
return child as T;
}
نصائح أخرى
قد تحاول استخدام VisualTreeHelper.getParent للسير على الشجرة المرئية ، بدلاً من الاعتماد على الوالد المنطقي.
ومع ذلك ، قد تفكر في ما إذا كان يمكنك لف شخصك في فئة personitem ، مع معلومات سياق إضافية حتى يعرف الشخص كيفية إزالة الشخص من القائمة. سأستخدم هذا النمط أحيانًا وكتبت فئة alsapsulatingCollection التي تقوم تلقائيًا بتركيب كائنات التفاف بناءً على التغييرات في ObservableCollection التي يتم مراقبتها.