在一个事件中,我想将焦点放在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/

10-10 21:56