如何将焦点设置在ListView的第一项?

时间:2014-12-15 15:46:12

标签: c# wpf listview data-binding focus

我正在尝试在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()解决问题。

3 个答案:

答案 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。