2010-03-22 5 views
6

ViewModel의 ObservableCollection에 바인딩 된 ItemsControl이 내 View에 있습니다. 컬렉션이 채워진 후 VM에서 볼 수있는 이벤트가 발생합니다 (검색 결과 및 SearchFinished 이벤트 생각).WPF ItemsControl - 항목로드가 완료된 시점을 파악하여 첫 번째 항목에 집중할 수있는 방법은 무엇입니까?

키보드 포커스를 ItemsControl의 첫 번째 항목으로 이동하고 싶습니다.하지만 SearchFinished를 처리 할 때 View의 코드 숨김에서 항목을 아직 렌더링하지 않았습니다 (컬렉션은 이미 채워졌지만 wpf의 렌더링은 비동기이며 아직 발생하지 않았습니다.) 그래서 초점을 맞추는 것이 없습니다 (Focus()는 항목의 시각적 트리를 이미 생성해야합니다).

(myItemsControl.ItemContainerGenerator.ContainerFromIndex (0) as UIElement) .Focus();하지만 0 번째 항목이 아직로드되지 않았으므로 ContainerFromIndex (0)은 null을 반환합니다.

낮은 우선 순위로 Dispatcher.BeginInvoke ...를 사용하여 지연을 시도했지만 정확한 타이밍에 의존하며 일반적으로 작동하지 않습니다.

ItemsControl의 첫 번째 항목이로드 될 때까지 어떻게 기다릴 수 있습니까?

답변

8

ItemContainerGenerator.StatusChanged 이벤트를 사용하고 해당 Status 속성을 확인할 수 있습니다. Status == GeneratorStatus.ContainersGenerated 인 경우 첫 번째 컨테이너를 안전하게 얻을 수 있습니다.

+0

감사합니다. 완벽하게 작동합니다. –