将列表视图自动滚动到最后添加的项目的最佳方式是什么?

问题描述:

我使用ListView来显示错误列表,因为它们出现在我的应用程序中。它的行为和外观与Visual Studio中的错误列表完全相同。我想在选择最后一个错误项目时添加自动滚动功能(例如,当您将插入符号放在最后时,Visual Studio的日志窗口如何自动滚动)。将列表视图自动滚动到最后添加的项目的最佳方式是什么?

错误列表处于ObservableCollection,它被传递到ListView.ItemsSource这样的:

public ObservableCollection<ErrorListItem> Items; 
... 
MyListView.ItemsSource = _Items; 

我试图在_Items_CollectionChanged事件处理程序进行自动滚动,而是因为这是事件的ItemsSource而不是在实际ListViewItems,这是一个痛苦,找出是否最后一个项目被选中,选择新行,等等。这是特别困难,因为它似乎不是立即创建ListViewItems。我设法拖延通话设置选择这样的最后一个项目,使其自动滚动:

void _Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    // determine the last item to select from 'e' 
    ...   

    _ItemPendingToBeScrolled = newItemToSelect; 
    ListView.SelectedItem = newItemToSelect; 


    Dispatcher.BeginInvoke(DispatcherPriority.Background, 
     (ThreadStart)delegate 
     { 
      if (_ItemPendingToBeScrolled != null) 
      { 
       ListView.ScrollIntoView(_ItemPendingToBeScrolled); 
       ItemPendingToBeScrolled = null; 
      } 
     }) 
} 

但是,这显然不是这样做的正确方法。另外,如果列表已被过滤(不检查源代码中的最后一个项目,但是ListView中的最后一个ListViewItem),我希望事情继续工作。

添加到绑定集合后,ListViewItem被添加到ListView时,是否有方法来监听事件?这将是捕获的理想事件,以便正确进行自动滚动。还是有另一种技术可以使用?

我有很多与列表框/列表视图,和他们滚动的问题,但是,你提到钩住ListView的更改事件,是不是因为你可以不听观察集合的CollectionChanged事件? ObservableCollection比List控件更稳定,你会得到相同的通知。

如果这些事件不在UI中工作并且您没有访问权限,您也可以将这些事件向上冒泡,这样您可以在不访问实际集合的情况下对待滚动UI,只需保留对Selected您自定义EventArgs类中的项目