سؤال

لقد أنشأت أ ListBox التي لديها DataTemplate مثل Itemtemplate.ومع ذلك، هل هناك طريقة سهلة للوصول إلى الملف الذي تم إنشاؤه UIElement بدلا من ال SelectedItem في خلف الكود؟

عندما أقوم بالوصول SelectedItem, ، لقد حصلت للتو على الكائن المحدد من ملفيItemsSource مجموعة.هل هناك طريقة للوصول إلى UIElement (أي.العنصر المتولد من DataTemplate مع الكائن المنضم)؟

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

المحلول

أنت تبحث عن ItemContainerGenerator ملكية.كل ItemsSource لديه ItemContainerGenerator مثال.يحتوي هذا الفصل على الطريقة التالية التي قد تهمك: حاوية من العنصر (مثيل الكائن).

بمجرد أن يكون لديك مقبض ل ListBoxItem, ، يمكنك المضي قدمًا وتصفح الشجرة المنطقية والمرئية.الدفع مساعد الشجرة المنطقية و مساعد الشجرة البصرية.

كما قال آندي في التعليقات، فإن مجرد وجود العنصر في مجموعتك لا يعني أنه تم إنشاء حاوية له.أي نوع من سيناريوهات لوحة المحاكاة الافتراضية سوف يثير هذه المشكلة؛سيتم إعادة استخدام عناصر UIElements عبر العناصر المختلفة.كن حذرا مع ذلك أيضا.

نصائح أخرى

الاحجام ، <م> اندي و <م> Bodeaker على حق تماما.

وهنا هو كيف كنت قادرا على استرداد النص من العنصر المحدد في مربع القائمة باستخدام مقبضها.

var container = listboxSaveList.ItemContainerGenerator.ContainerFromItem(listboxSaveList.SelectedItem) as FrameworkElement;
if (container != null)
{
    ContentPresenter queueListBoxItemCP = VisualTreeWalker.FindVisualChild<ContentPresenter>(container);
    if (queueListBoxItemCP == null)
        return;

    DataTemplate dataTemplate = queueListBoxItemCP.ContentTemplate;

    TextBox tbxTitle = (TextBox)dataTemplate.FindName("tbxTitle", queueListBoxItemCP);
    tbxTitle.Focus();
}

و(ملاحظة: هنا، VisualTreeWalker هي لغتي المجمع الخاص على VisualTreeHelper مع مختلف وظائف مفيدة يتعرضون)

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