문제

나는 a ListBox 그게 a DataTemplate ~처럼 Itemtemplate. 그러나 생성 된 것에 쉽게 액세스 할 수있는 방법이 있습니까? UIElement 대신 SelectedItem CodeBehind에서?

내가 접근 할 때 SelectedItem, 나는 단지 내에서 선택한 개체를 얻습니다ItemsSource 수집. 액세스하는 방법이 있습니까? UIElement (즉, 요소에서 생성 된 요소 DataTemplate 바운드 객체와 함께)?

도움이 되었습니까?

해결책

당신은 찾고 있습니다 ItemContainergenerator 재산. 각 ItemsSource 있습니다 ItemContainergenerator 사례. 이 클래스에는 다음과 같은 방법이 있습니다. Containerfromitem (객체 인스턴스).

일단 당신이 손잡이를 가지고있다 ListBoxItem, 당신은 계속해서 논리적이고 시각적 인 트리를 탐색 할 수 있습니다. 체크 아웃 논리적 나무 도우미 그리고 시각적 트리 도우미.

Andy가 의견에서 말했듯이, 컬렉션에 항목이 존재한다고해서 컨테이너가 생성되었음을 의미하지는 않습니다. 모든 종류의 가상화 패널 시나리오로 인해이 문제가 발생합니다. Uielements는 다른 항목에서 재사용됩니다. 그것에 대해서도 조심하십시오.

다른 팁

시즈, 앤디 그리고 보디 키커 절대적으로 옳습니다.

다음은 핸들을 사용하여 ListBox의 선택된 항목의 텍스트 상자를 검색 할 수있는 방법입니다.

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