将列表视图自动滚动到最后添加的项目的最佳方式是什么?
我使用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类中的项目