如何在添加数据后滚动到ListView的末尾 - WPF

时间:2014-01-25 08:11:26

标签: c# wpf listview event-handling command

我尝试在按钮点击处理程序中添加以下内容:

        ListView listView = MyListView;
        int lastItemIndex = listView.Items.Count - 1;
        listView.ScrollIntoView(listView.Items[lastItemIndex]);
        listView.UpdateLayout();

按钮单击还与命令处理程序相关联,该命令处理程序将项添加到与ListView关联的ObservableCollection。

问题是在我的命令处理程序之前调用了按钮单击处理程序,因此它太早了。在按钮单击处理程序中,ListView尚未看到已添加项目的已更新ObservableCollection。什么事件或更好的事情,在我的项目被添加到ObservableCollection之后,如果不更改后面的代码以使ListView滚动到结尾,我该怎么办?我已经看了但在stackoverflow中没有任何答案。谢谢!

2 个答案:

答案 0 :(得分:4)

如果您 ItemSource是ObservableCollection ,您可以在Window / UserControl构造函数中挂钩 CollectionChanged 事件,并且将项目添加到视图中时将滚动到视图中集合

假设你的基础类是 TesClass ,你就是这样做的:

((INotifyCollectionChanged)listView.ItemsSource).CollectionChanged +=
     (s, e) =>
     {
         if (e.Action == 
             System.Collections.Specialized.NotifyCollectionChangedAction.Add)
         {
             listView.ScrollIntoView(listView.Items[listView.Items.Count - 1]);
         }
     };

答案 1 :(得分:1)

试试这个

VirtualizingStackPanel vsp = (VirtualizingStackPanel)typeof(ItemsControl).InvokeMember("_itemsHost", BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic, null, _listView, null);

double scrollHeight = vsp.ScrollOwner.ScrollableHeight;
double offset = scrollHeight * lastItemIndex // itemIndex_ is index of the item which we want to show in the middle of the view

vsp.SetVerticalOffset(offset);

VirtualizingStackPanel