كيف يمكنني تخزين TreeViewItems لإعادة التوسيع بعد إعادة ربط؟

StackOverflow https://stackoverflow.com/questions/3135321

  •  01-10-2019
  •  | 
  •  

سؤال

لديّ TreeView مرتبط بفئة تجميع ليس لدي أي سيطرة عليها. داخل هذه الفئة عبارة عن مجموعة من الكائنات ، والتي لكل منها مجموعة من العناصر الخاصة بها. تم إصلاح هذا التسلسل الهرمي في 3 عميق. يتم احتواء أطفال TreeView في ObservableCollection ويتم تحديثهم في TreeView وفقًا لذلك. لا يمكن ملاحظة المجموعات الموجودة داخل كل من هذه الأشياء ، وبالتالي يتعين علي إعادة ربط البيانات يدويًا إلى TreeView في كل مرة أضيف فيها كائنًا إلى أحد الأطفال. هذا يتسبب في إعادة تعيين جميع الأطفال الموسعين إلى حالة غير متوفرة. أحاول تخزين الكائنات التي تم توسيعها حتى يمكن إعادة توحيدها بعد إعادة ربطها. يعمل الأطفال كما أتوقع ، ولكن عندما أحاول توسيع حفيد TreeView ، أحصل على كائن فارغ.

للحصول على TreeViewItem ، أستخدم خاصية itemContainerGenerator من العناصر Control:

TreeViewItem cfItem = treeView.ItemContainerGenerator
    .ContainerFromItem(obj) as TreeViewItem;
cfItem.IsExpanded = true;

جميع مجموعات المستوى الثاني لها إشارة إلى كائن الوالدين. لذلك نظرًا لأن لدي العديد من هذه الأشياء ، فهي محاطية ويستخدم كل منها كائنًا رئيسيًا للعثور على TreeViewItem من الوالد. الترتيب الذي يضاف به إلى ضمانات المجموعة (على ما أظن) أن الأطفال سيتم معالجتهم دائمًا بعد الوالد. وبالتالي أحصل على هذا الخط القبيح من الكود:

qualItem = (
    (TreeViewItem)treeView.ItemContainerGenerator
        .ContainerFromItem(
            ((Child)obj).ParentObject
        )
    )
    .ItemContainerGenerator.ContainerFromItem(obj) as TreeViewItem;

يفشل هذا الخط دائمًا عندما يحاول الحصول على الحاوية من البند OBJ. إنه يحصل بنجاح على TreeViewItem ، ولكن عند محاولة الحصول على حاوية TreeViewItem للطفل ، أتلقى دائمًا NULL. تنص الوثائق على إرجاع containerfromitem ()

"A system.windows.uilement يتوافق مع العنصر المحدد. إرجاع فارغة إذا كان العنصر لا ينتمي إلى مجموعة العناصر ، أو إذا لم يتم إنشاء نظام.

أعلم أن الطفل المستوى الثاني موجود في جمع العناصر الوالد. لقد راجعت مصحح الأخطاء في VS 2010 ، وجميع العناصر موجودة. لقد أمضيت وقتًا طويلاً في Google في البحث عن إجابة ، وصادفت شخصًا قال إن عناصر الحاوية يتم إنشاؤها على موضوع عامل في الخلفية وقد لا يتم إنشاؤها بحلول الوقت الذي يتم فيه إجراء محاولة للحصول على حاوية عنصر الطفل. حاولت انتظار خاصية الحالة الخاصة بـ itemContainerGenerator لتكون مساوية لـ generatorstatus.containersgenerated ، لكن لا يزال لدي نفس النتيجة. أحتاج إلى الحصول على حاوية TreeViewitem بطريقة أو بأخرى لأطفالي من المستوى الثاني حتى يمكن إعادة توحيدهم تمامًا مثل الأطفال من المستوى الأول.

هل كانت مفيدة؟

المحلول 2

الحل هو إضافة طبقة أخرى من التجريد بين البيانات و TreeView. مجموعة المستوى الأعلى هي عبارة عن ObservableCollection ، والتي تحتوي على العديد من عوامل العرض ، التي تنفذ inotifyPropertyChanged ، وكذلك على مراقبة العناصر الموجودة في الشجرة تحتها. يتيح هذا النظام WPF للربط بسهولة وتتبع العناصر التي يتم إضافتها وحذفها.

كان المصدر الرئيسي للمعلومات الخاص بي هذا المقال:

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

نصائح أخرى

"A system.windows.uilement يتوافق مع العنصر المحدد. إرجاع فارغة إذا كان العنصر لا ينتمي إلى مجموعة العناصر ، أو إذا لم يتم إنشاء System.Windows.Uilement."

يبدو بسبب Virtualization, ، ال UIElement تبحث عن غير موجود عندما تبحث عنه. إذا لم تكن المجموعة كبيرة جدًا ، فحاول تحويل Virtualization إيقاف.

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