WPF ListBox - الحصول على UIElement بدلاً من SelectedItem
-
03-07-2019 - |
سؤال
لقد أنشأت أ 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 مع مختلف وظائف مفيدة يتعرضون)