WPF ItemsControl – как узнать, когда элементы завершили загрузку, чтобы я мог сфокусировать первый из них?
-
21-09-2019 - |
Вопрос
У меня есть ItemsControl в моем представлении, который привязан к ObservableCollection из ViewModel.Коллекция заполняется, а затем создается событие от виртуальной машины для просмотра (например, результаты поиска и событие SearchFinished).
Я хотел бы переместить фокус клавиатуры на первый элемент в ItemsControl, но когда я делаю это в коде View при обработке SearchFinished, элементы еще не визуализируются (коллекция уже заполнена, но рендеринг wpf является асинхронным и не выполняется). пока этого не произошло), поэтому фокусировать не на чем (Focus() необходимо, чтобы визуальное дерево элементов уже было построено).
Я хотел сделать (myItemsControl.ItemContainerGenerator.ContainerFromIndex(0) as UIElement).Focus();, но поскольку 0-й элемент еще не загружен, ContainerFromIndex(0) возвращает значение null.
Я попробовал отложить это с помощью Dispatcher.BeginInvoke...с низким приоритетом, но это зависит от точного времени и обычно не работает.
Как я могу дождаться загрузки первого элемента в ItemsControl?
Решение
Вы можете использовать ItemContainerGenerator.StatusChanged
событие, а затем проверьте его Status
свойство.Если Status == GeneratorStatus.ContainersGenerated
, то вы смело можете получить первый контейнер.