在一个事件中,我想将焦点放在ListViewItem模板内的特定TextBox上。 XAML看起来像这样:
<ListView x:Name="myList" ItemsSource="{Binding SomeList}">
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<!-- Focus this! -->
<TextBox x:Name="myBox"/>
我在后面的代码中尝试了以下方法:
(myList.FindName("myBox") as TextBox).Focus();
但我似乎误解了
FindName()
文档,因为它返回了null
。ListView.Items
也无济于事,因为(当然)包含我绑定的业务对象,并且没有ListViewItems。myList.ItemContainerGenerator.ContainerFromItem(item)
也不会返回null。 最佳答案
要了解为什么ContainerFromItem
不适用于我,这里有一些背景知识。我需要此功能的事件处理程序如下所示:
var item = new SomeListItem();
SomeList.Add(item);
ListViewItem = SomeList.ItemContainerGenerator.ContainerFromItem(item); // returns null
在
Add()
之后,ItemContainerGenerator
不会立即创建容器,因为CollectionChanged
事件可以在非UI线程上处理。相反,它将启动异步调用,并等待UI线程回调并执行实际的ListViewItem控件生成。为了在发生这种情况时得到通知,
ItemContainerGenerator
公开了一个StatusChanged
事件,该事件在生成所有Container之后触发。现在,我必须收听此事件并确定控件当前是否要设置焦点。
关于wpf - 如何访问WPF ListView的ListViewItems?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/92328/