2009-03-04 3 views
10

DataTemplateItemtemplateListBox을 만들었습니다. 그러나 코드 숨김에서 SelectedItem 대신에 생성 된 UIElement에 액세스하는 쉬운 방법이 있습니까?WPF ListBox - SelectedItem 대신 UIElement 가져 오기

SelectedItem에 액세스하면 ItemsSource 컬렉션에서 선택한 객체를 가져옵니다. UIElement (즉, DataTemplate에서 바인딩 된 개체와 함께 생성 된 요소)에 액세스 할 수 있나요?

답변

11

ItemContainerGenerator 속성을 찾고 있습니다. 각 ItemsSource에는 ItemContainerGenerator 인스턴스가 있습니다. 이 클래스에는 다음과 같은 방법으로 관심을 가질 수 있습니다 : ContainerFromItem(object instance).

ListBoxItem에 대한 핸들이 있으면 논리 및 시각 트리를 찾아 볼 수 있습니다. Logical Tree HelperVisual Tree Helper을 확인하십시오.

앤디 (Andy)는 댓글에서 아이템이 컬렉션에 존재한다고해서 컨테이너가 생성되었음을 의미하지는 않습니다. 어떤 종류의 가상화 패널 시나리오가이 문제를 제기 할 것입니다. UIElements는 여러 항목에서 재사용됩니다. 조심해.

+0

주, 즉 의미하지 않는다 자사의 UI 컨테이너 생성되었습니다. 아직 UI ​​컨테이너가없는 경우를 고려해야합니다. – Andy

+0

C# 및 WPF로 작성 중이며 ListBox.ItemsContainer 아래에이 속성이 표시되지 않습니다.이 목록 상자의 인스턴스를 어떻게 가져 옵니까? – sprite

+0

@size, 내 질문에 대한 해결책이 있습니까? 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을 통해 내 자신의 래퍼) 항목이 컨트롤에 추가되었습니다해서