2009-03-04 17 views
10

के बजाय UIElement प्राप्त करना मैंने ListBox बनाया है जिसमें DataTemplateItemtemplate है। हालांकि, क्या कोडबेहिंड में SelectedItem के बजाय उत्पन्न UIElement तक पहुंचने का कोई आसान तरीका है?डब्ल्यूपीएफ लिस्टबॉक्स - चयनित इटैम

जब मैं SelectedItem तक पहुंचता हूं, तो मुझे बस अपने ItemsSource संग्रह से चयनित ऑब्जेक्ट मिलता है। क्या UIElement (यानी तत्व DataTemplate से बाध्य ऑब्जेक्ट के साथ उत्पन्न) का उपयोग करने का कोई तरीका है?

उत्तर

11

आप ItemContainerGenerator संपत्ति की तलाश में हैं। प्रत्येक ItemsSource में ItemContainerGenerator उदाहरण है। इस श्रेणी में निम्न विधि है जो आपको रूचि दे सकती है: ContainerFromItem(object instance)

एक बार जब आप ListBoxItem पर हैंडल करते हैं, तो आप आगे बढ़ सकते हैं और तार्किक और दृश्य पेड़ ब्राउज़ कर सकते हैं। Logical Tree Helper और Visual Tree Helper देखें।

एंडी ने टिप्पणियों में कहा, सिर्फ इसलिए कि आपके संग्रह में मौजूद आइटम का मतलब यह नहीं है कि इसके लिए एक कंटेनर उत्पन्न हुआ है। वर्चुअलाइजिंग पैनल परिदृश्य का कोई भी प्रकार इस मुद्दे को उठाएगा; UIElements विभिन्न वस्तुओं में पुन: उपयोग किया जाएगा। इसके साथ भी सावधान रहें।

+0

ध्यान दें कि सिर्फ इसलिए कि एक आइटम नियंत्रण में जोड़ा गया है, इसका मतलब यह नहीं है कि इसकी यूआई कंटेनर अभी तक उत्पन्न किया गया है। उस मामले के लिए खाता बनाना सुनिश्चित करें जहां अभी तक कोई यूआई कंटेनर नहीं है। – Andy

+0

मैं सी # और डब्ल्यूपीएफ में लिख रहा हूं और यह संपत्ति ListBox.ItemsContainer के अंतर्गत दिखाई नहीं दे रही है मैं इस सूची बॉक्स के लिए उदाहरण कैसे प्राप्त करूं? – sprite

+0

@ आकार, क्या आपके पास मेरे प्रश्न का समाधान है? http://stackoverflow.com/questions/6148279/record-items-visible-to-user-in-listbox (+250 बक्षीस) – tofutim

4

siz, एंडी और 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 से अधिक अपने ही आवरण है)

संबंधित मुद्दे