我正在尝试在WPF应用程序中实现一个小搜索模块。搜索结果绑定到ListView,我希望在填充新结果后立即将焦点设置在此ListView
的第一项上。
此问题的解决方案 - Set Item Focus in ListView WPF - 建议调用ContainerFromIndex(int index)
方法获取必要的ListViewItem
。在我的搜索过程的最后尝试这个返回null。因此,我推断尽管已经填充了ListView
的来源,但此时此视图本身尚未更新。
我尝试的下一件事是处理SourceUpdated
的{{1}}事件。它没有发射。我在问题的答案中指出ListView
添加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()
解决问题。
答案 0 :(得分:1)
在尝试获取UpdateLayout()
之前调用ListViewItem
方法可以解决问题。
答案 1 :(得分:0)
您可以达到要求的一种方法是使用您说您必须访问的关联ListViewItem
所选项目。试试这个:
ListViewItem item = YourListView.ItemContainerGenerator.
ContainerFromItem(YourSelectedItem) as ListViewItem;
获得关联的ListViewItem
后,您可以简单地关注它,如下所示:
item.Focus();
答案 2 :(得分:0)
将SelectedItem绑定到ViewModel中的属性。
SelectedItem="{Binding PropertyNameHere}"
当在集合上更改所选项目时,它也将在绑定到所选项目的属性上更新。
因此,在搜索过程结束时,只需将bound属性设置为集合中的第一个项目即可。
if (FoundRequests.Count > 0)
PropertyNameHere = FoundRequests[0];
您无需为绑定属性担心INotifyPropertyChanged。