wpf - 将 ListView 自动滚动到最后添加的项目的最佳方式是什么?

标签 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;
            } 
        })
}

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

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

最佳答案

我对列表框/ ListView 及其滚动有很多问题,但是,您提到 Hook 到 ListView 的更改事件,是因为您无法收听可观察集合的 CollectionChanged 事件吗? ObservableCollection 比 List 控件更稳定,并且您会收到相同的通知。

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

关于wpf - 将 ListView 自动滚动到最后添加的项目的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/796078/

相关文章:

wpf - 在 Wpf 中正确绑定(bind) DataTemplate 内的组合框

c# - 如何在 XAML 中绑定(bind) UIElements?

Android ListView 项目未填满宽度

c# - Winforms - 如何允许用户使用隐藏控件增加 ListView 的字体大小?

c# - ObservableCollection<T> 项目更新事件

WPF dataGgridCell 编辑模式

c# - 应用程序在 windows xp 中运行良好,但在 windows 7 中运行时应用程序崩溃?

html - 在这种情况下,checkbox value = '1' 不起作用的是什么?

android - 在 Android ListView 中重置背景颜色

wpf - 如何从 GridView 中绑定(bind)到 ViewModel 的属性