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

C# 如何在添加数据后滚动到ListView的末尾-WPF,c#,wpf,listview,event-handling,command,C#,Wpf,Listview,Event Handling,Command,我尝试在按钮单击处理程序中添加以下内容: ListView listView = MyListView; int lastItemIndex = listView.Items.Count - 1; listView.ScrollIntoView(listView.Items[lastItemIndex]); listView.UpdateLayout(); 单击按钮还与一个命令处理程序相关联,该命令处理程序向与ListView关联

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

        ListView listView = MyListView;
        int lastItemIndex = listView.Items.Count - 1;
        listView.ScrollIntoView(listView.Items[lastItemIndex]);
        listView.UpdateLayout();
单击按钮还与一个命令处理程序相关联,该命令处理程序向与ListView关联的ObservableCollection中添加一个项

问题是,在我的命令处理程序之前调用了按钮单击处理程序,所以现在太早了。在按钮单击处理程序中,ListView尚未看到带有添加项的更新的ObservableCollection。在什么事件或更好的情况下,在将我的项目添加到ObservableCollection后,如果不更改后面的代码以使ListView滚动到末尾,我可以做什么?我在stackoverflow中找不到答案。谢谢

试试这个

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);

如果ItemSource是ObservableCollection,则可以在窗口/用户控件构造函数中挂钩到CollectionChanged事件,并在集合中添加项时将最后一项滚动到视图中

假设您的基础类是TesClass,您将这样做:

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

太好了,谢谢!如果方便的话,您知道将其移近模型类是否更好吗?因为它是非常特定于领域/模型的。如何在考虑MVVM的情况下做到这一点?再次感谢。是否改为使用界面,即
INotifyCollectionChanged
(在回答中检查更新)?这样,您就可以从视图中访问任何模型类中抽象出来。同时,将其移动到ViewModel对我来说似乎不合适,因为我们在这里做的是视图特定的事情(将项目滚动到视图中)。有了合适的接口,我想一切都很好。如果底层模型类从TestClass更改为任何其他类,您不必担心。(当然,只要您绑定到实现INotifyCollectionChanged的集合)。