В моем приложении мне необходимо получить содержимое ItemsCollection сразу после изменения ItemsSource. Или, по крайней мере, до возможности визуального отображения контента.
Я проверил что-то похожее на следующее:
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));
}
}
Проблема в том, что в точке вызова DoSomething значение VisualTreeHelper.GetChildrenCount(container)
равно 0
. Если вместо этого этот код вызывается в более поздний момент времени - например, в ответ на срабатывание события Button.Click
, VisualTreeHelper.GetChildrenCount
является ожидаемым значением, и код предположительно будет работать.
PS. Я также попытался провести цикл 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));
}
};
К сожалению, поведение идентично.
редактировать
Я не могу поверить, сколько обручей вы должны перепрыгнуть для создания контента.
Я полагаю, что нашел самый ранний момент, когда я смог безопасно захватить сгенерированные контейнеры. Тем не менее, я все еще не обращаю внимания на сгенерированный контент внутри этих контейнеров. Обратите внимание на следующее:
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. Мне бы очень хотелось узнать, решил ли кто-нибудь это.