WPF ItemsControl - how to know when the items finished loading, so that I can focus the first one?

霸气de小男生 提交于 2019-12-21 12:21:27

问题


I have an ItemsControl in my View, that is bound to an ObservableCollection from ViewModel. The collection is filled, and afterwards an event from VM to view is raised (think search results and SearchFinished event).

I would like to move keyboard focus to the first item in an ItemsControl, but when I do it in View's code-behind when handling SearchFinished, the items are not yet rendered (the collection is filled already, but wpf's rendering is asynchronous and didn't happen yet), so there is nothing to focus (Focus() needs to have the items' visual tree already constructed).

I wanted to do (myItemsControl.ItemContainerGenerator.ContainerFromIndex(0) as UIElement).Focus();, but as the 0th item is not yet loaded, ContainerFromIndex(0) returns null.

I tried delaying it with Dispatcher.BeginInvoke... with low priority, but that is dependent on exact timing and usually doesn't work.

How can I wait until the first item in ItemsControl is Loaded?


回答1:


You can use the ItemContainerGenerator.StatusChanged event, and then check its Status property. If the Status == GeneratorStatus.ContainersGenerated, then you can safely get the first container.



来源:https://stackoverflow.com/questions/2492214/wpf-itemscontrol-how-to-know-when-the-items-finished-loading-so-that-i-can-fo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!