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

时间:2009-04-28 03:09:06

标签: wpf data-binding listview listviewitem

我使用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;
            } 
        })
}

但这显然不是正确的做法。此外,如果列表已过滤,我希望事情继续有效(不检查我的源中的最后一项,而是查看ListViewItem中的最后一项ListView)。

在添加到绑定集合后,ListViewItem添加到ListView时,有没有办法监听事件?这将是捕获的理想事件,以便正确地进行我的自动滚动。或者我可以使用另一种技术吗?

1 个答案:

答案 0 :(得分:0)

我在列表框/列表视图及其滚动方面存在很多问题,但是,您提到挂钩到listview的已更改事件,是因为您无法侦听可观察集合的CollectionChanged事件? ObservableCollection比List控件更稳定,你会得到相同的通知。

如果它在UI中不起作用并且你没有访问权限,你也可以冒泡这些事件,这样你就可以在UI中处理你的滚动而无需访问实际的集合,只需保留对Selected Item的引用在您的自定义EventArgs类