내 응용 프로그램에서는 ItemsSource가 변경된 직후 ItemsCollection의 내용을 가져와야합니다. 또는 최소한 내용을 시각적으로 그릴 가능성이 있기 전에.WPF에서 가능한 경쟁 조건 ItemsCollection.ItemContainerGenerator
void UserControl_Loaded(object sender, EventArgs eventArgs) {
this.itemsControl.ItemsSource = GetItemsSource();
int ctrIndex = 0;
DependencyObject container;
while((container = this.itemsControl.ItemContainerGenerator.
ContainerFromIndex(ctrIndex++)) != null) {
DoSomething(VisualTreeHelper.GetChild(container, 0));
}
}
문제는 해봐요가 호출되는 시점에서, VisualTreeHelper.GetChildrenCount(container)
의 값이 0
입니다 것입니다 :
Button.Click
이벤트 발생에 대한 응답으로 나중에 호출 될 경우
VisualTreeHelper.GetChildrenCount
이 예상 값이며 코드가 작동 할 수 있습니다.
추신. 또한 익명 함수 내부에서 while 루프를 수행하려고 시도했습니다.
this.itemsControl.ItemContainerGenerator.ItemsChanged += (_sender, _ea) => {
int ctrIndex = 0;
DependencyObject container;
while((container = this.itemsControl.ItemContainerGenerator.
ContainerFromIndex(ctrIndex++)) != null) {
DoSomething(VisualTreeHelper.GetChild(container, 0));
}
};
동작은 슬프게도 동일합니다.
난 당신이 생성 된 콘텐츠를 통해 이동해야한다 얼마나 많은 농구 믿을 수 없다
편집.
생성 된 컨테이너를 안전하게 캡처 할 수있는 가장 빠른 순간을 찾았습니다. 그러나, 나는 아직도 그 컨테이너 안의 생성 된 내용에 대해 nil을 설정하고있다. 다음 관찰 :
this.itemsControl.ItemContainerGenerator.StatusChanged += new EventHandler(StatusChanged);
void StatusChanged(object sender, EventArgs e) {
var cg = this.itemsControl.ItemContainerGenerator;
if(cg.Status == GeneratorStatus.ContainersGenerated && cg.ContainerFromIndex(0) != null) {
DoStuff();
}
}
를 점 DoStuff에서()가 호출, ContainerFromIndex
에서 반환 된 용기는 null이 아니다. 그러나 VisualTreeHelper.GetChildrenCount(container)
은 0입니다. 저는 여전히 누군가가 이것을 해결했는지 알고 싶습니다.
독자에게 ItemsControl 내에서 생성 된 내용을 참조 할 수있는 확실한 방법이 없다는 점을 알아 보았습니다. 모든 비용을 들이지 않고 이것을 피하십시오. – Kivin