【问题标题】:How to Scroll To End of ListView After Data Added - WPF添加数据后如何滚动到 ListView 的末尾 - WPF
【发布时间】:2014-01-25 08:11:26
【问题描述】:

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

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

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

问题是按钮单击处理程序在我的命令处理程序之前调用,因此为时过早。在按钮单击处理程序中,ListView 还没有看到更新后的 ObservableCollection 以及添加的项目。什么事件或者更好的是,在我的项目添加到 ObservableCollection 之后,如果不更改后面的代码以使 ListView 滚动到末尾,我该怎么办?我已经在 stackoverflow 中查看了但还没有找到答案。谢谢!

【问题讨论】:

    标签: c# wpf listview event-handling command


    【解决方案1】:

    如果您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]);
             }
         };
    

    【讨论】:

    • 太好了,谢谢!如果方便,您知道将其移近模型类是否会更好?想知道,因为 是非常特定于域/模型的。关于如何使用 MVVM 做到这一点的想法?再次感谢。
    • 如何使用接口而不是INotifyCollectionChanged(检查答案中的更新)?这样,您就可以从视图中抽象出访问任何模型类。将其移至 ViewModel 对我来说似乎也不合适,因为我们在这里执行特定于视图的操作(将项目滚动到视图中)。有了接口,我想它非常好。如果底层模型类从 TestClass 更改为任何其他类,您不必担心。 (当然,只要您绑定到实现 INotifyCollectionChanged 的​​集合)。
    【解决方案2】:

    试试这个

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 2013-08-15
      • 2011-04-06
      • 2012-05-05
      • 1970-01-01
      • 2016-03-08
      相关资源
      最近更新 更多