2009-03-04 31 views
10

stworzyłem ListBox że ma DataTemplate jak Itemtemplate. Czy istnieje jednak prosty sposób uzyskania dostępu do wygenerowanego kodu UIElement zamiast kodu SelectedItem w kodzie?WPF ListBox - Pierwsze UIElement zamiast z selectedItem

Po uzyskaniu dostępu do SelectedItem, właśnie otrzymuję wybrany obiekt z mojej kolekcji ItemsSource. Czy istnieje sposób dostępu do elementu UIElement (tj. wygenerowanego z obiektu DataTemplate wraz z powiązanym obiektem)?

Odpowiedz

11

Poszukujesz właściwości ItemContainerGenerator. Każdy egzemplarz ItemsSource ma instancję ItemContainerGenerator. Ta klasa ma następującą metodę, która może Cię zainteresować: ContainerFromItem(object instance).

Po przejściu do ListBoxItem można przeglądać drzewo logiczne i wizualne. Sprawdź Logical Tree Helper i Visual Tree Helper.

Podobnie jak Andy powiedział w komentarzach, tylko dlatego, że przedmiot istnieje w Twojej kolekcji, nie oznacza, że ​​został wygenerowany dla niego kontener. Każdy scenariusz wirtualnego panelu podniesie ten problem; UIElements będą ponownie wykorzystane w różnych pozycjach. Ostrożnie z tym również.

+0

Należy pamiętać, że tylko dlatego, że przedmiot został dodany do kontroli, to nie znaczy, że jego opakowanie UI został już wygenerowany. Pamiętaj, aby uwzględnić przypadek, w którym nie ma jeszcze kontenera interfejsu użytkownika. – Andy

+0

Piszę w C# i WPF i ta właściwość nie pojawia się w ListBox.ItemsContainer Jak uzyskać wystąpienie dla tego listbox? – sprite

+0

@ size, czy masz rozwiązanie dla mojego pytania? http://stackoverflow.com/questions/6148279/record-items-visible-to-user-in-listbox (+250 bounty) – tofutim

4

siz, Andy i Bodeaker absolutną rację.

Oto, w jaki sposób udało mi się pobrać pole tekstowe wybranego elementu listbox za pomocą jego uchwytu.

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(); 
} 

(Uwaga: W tym VisualTreeWalker jest moje własne otoki nad VisualTreeHelper z różnych przydatnych funkcji narażonych)

Powiązane problemy