【发布时间】:2014-12-15 15:46:12
【问题描述】:
我正在尝试在 WPF 应用程序中实现一个小搜索模块。搜索结果绑定到 ListView,我想在此ListView 的第一项填充新结果后立即将焦点设置在它的第一项上。
这个问题的解决方案——Set Item Focus in ListView WPF——建议调用ContainerFromIndex(int index)方法来获取必要的ListViewItem。在我的搜索过程的最后尝试这个会返回 null。因此,我推断虽然ListView 的源已经被填充,但视图本身并没有在此时更新。
接下来我尝试处理ListView 的SourceUpdated 事件。它不火。我将NotifyOnSourceUpdated=True 添加到绑定中,正如这个问题的答案中所指出的那样 - sourceupdated event not firing - 但事件仍然没有触发。
我只是补充说绑定本身是有效的。那么,将焦点设置在 ListView 的第一项(或任何其他项)上的正确方法是什么?
编辑:我将提供 XAML 的相关部分以使事情更清楚:
<ListView Name="foundRequestsListView"
IsSynchronizedWithCurrentItem="True"
utils:GridViewSort.AutoSort="True"
ItemsSource="{Binding Path=FoundRequests, NotifyOnSourceUpdated=True}"
SourceUpdated="foundRequestsListView_SourceUpdated" >
<ListView.Resources>...</ListView.Resources>
<ListView.View>
<GridView>...</GridView>
</ListView.View>
</ListView>
FoundRequests 属性是一个普通的List。
编辑:事先调用UpdateLayout() 可以解决问题。
【问题讨论】:
-
我只是将
List绑定到控件。我在问题中添加了相关的 XAML。至于SelectedItem属性,我没用过。我能够以编程方式选择一个项目,但不能使其成为焦点。 -
您应该将
ListView绑定到ObservableCollection,以便在集合更改时收到通知。否则,ListView控件将仅获取项目一次。 -
试过了。
SourceUpdated事件仍然没有触发。ListView在每次搜索后获取项目,所以这不是一个真正的问题。
标签: c# wpf listview data-binding focus