如何访问 WPF ListView 的 ListViewItems? [英] How can I access the ListViewItems of a WPF ListView?

查看:18
本文介绍了如何访问 WPF ListView 的 ListViewItems?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在一个事件中,我想将焦点放在 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?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆