我尝试在按钮点击处理程序中添加以下内容:
ListView listView = MyListView;
int lastItemIndex = listView.Items.Count - 1;
listView.ScrollIntoView(listView.Items[lastItemIndex]);
listView.UpdateLayout();
按钮单击还与命令处理程序相关联,该命令处理程序将项添加到与ListView关联的ObservableCollection。
问题是在我的命令处理程序之前调用了按钮单击处理程序,因此它太早了。在按钮单击处理程序中,ListView尚未看到已添加项目的已更新ObservableCollection。什么事件或更好的事情,在我的项目被添加到ObservableCollection之后,如果不更改后面的代码以使ListView滚动到结尾,我该怎么办?我已经看了但在stackoverflow中没有任何答案。谢谢!
答案 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);