سؤال

انا املك 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 التي يتم مراقبتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top