问题描述
在一个事件中,我想将焦点放在 ListViewItem 模板中的特定文本框上.XAML 看起来像这样:
Within an event, I'd like to put the focus on a specific TextBox within the ListViewItem's template. The XAML looks like this:
<ListView x:Name="myList" ItemsSource="{Binding SomeList}">
<ListView.View>
<GridView>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<!-- Focus this! -->
<TextBox x:Name="myBox"/>
我在后面的代码中尝试了以下内容:
I've tried the following in the code behind:
(myList.FindName("myBox") as TextBox).Focus();
但我似乎误解了 FindName()
文档,因为它返回 null
.
but I seem to have misunderstood the FindName()
docs, because it returns null
.
还有 ListView.Items
没有帮助,因为它(当然)包含我绑定的业务对象而没有 ListViewItems.
Also the ListView.Items
doesn't help, because that (of course) contains my bound business objects and no ListViewItems.
myList.ItemContainerGenerator.ContainerFromItem(item)
也不会,它也返回 null.
Neither does myList.ItemContainerGenerator.ContainerFromItem(item)
, which also returns null.
推荐答案
要了解为什么 ContainerFromItem
对我不起作用,这里有一些背景知识.我需要此功能的事件处理程序如下所示:
To understand why ContainerFromItem
didn't work for me, here some background. The event handler where I needed this functionality looks like this:
var item = new SomeListItem();
SomeList.Add(item);
ListViewItem = SomeList.ItemContainerGenerator.ContainerFromItem(item); // returns null
在 Add()
之后 ItemContainerGenerator
不会立即创建容器,因为 CollectionChanged
事件可以在非UI线程.相反,它启动一个异步调用并等待 UI 线程回调并执行实际的 ListViewItem 控件生成.
After the Add()
the ItemContainerGenerator
doesn't immediately create the container, because the CollectionChanged
event could be handled on a non-UI-thread. Instead it starts an asynchronous call and waits for the UI thread to callback and execute the actual ListViewItem control generation.
为了在发生这种情况时收到通知,ItemContainerGenerator
公开了一个 StatusChanged
事件,该事件在所有容器生成后触发.
To be notified when this happens, the ItemContainerGenerator
exposes a StatusChanged
event which is fired after all Containers are generated.
现在我必须监听此事件并决定控件当前是否要设置焦点.
Now I have to listen to this event and decide whether the control currently want's to set focus or not.
这篇关于如何访问 WPF ListView 的 ListViewItems?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!