WPF ItemsControl - как узнать, когда элементы закончили загрузку, чтобы я мог сфокусировать первый? - PullRequest
6 голосов
/ 22 марта 2010

В моем View есть ItemsControl, который привязан к ObservableCollection из ViewModel. Коллекция заполняется, и после этого создается событие из виртуальной машины для просмотра (например, результаты поиска и событие SearchFinished).

Я хотел бы переместить фокус клавиатуры на первый элемент в ItemsControl, но когда я делаю это в программном коде View при обработке SearchFinished, элементы еще не визуализируются (коллекция уже заполнена, но рендеринг wpf выполняется асинхронно и еще не произошло), поэтому фокусироваться не на чем (Focus () должен иметь уже построенное визуальное дерево элементов).

Я хотел сделать (myItemsControl.ItemContainerGenerator.ContainerFromIndex (0) как UIElement) .Focus () ;, но поскольку 0-й элемент еще не загружен, ContainerFromIndex (0) возвращает ноль.

Я пытался отложить его с помощью Dispatcher.BeginInvoke ... с низким приоритетом, но это зависит от точного времени и обычно не работает.

Как я могу ждать, пока первый элемент в ItemsControl будет загружен?

1 Ответ

8 голосов
/ 22 марта 2010

Вы можете использовать событие ItemContainerGenerator.StatusChanged, а затем проверить его свойство Status. Если Status == GeneratorStatus.ContainersGenerated, то вы можете смело получить первый контейнер.

...