如何在WPF ListView的基础集合更改时正确调整滚动条的大小?

时间:2009-07-06 13:37:48

标签: wpf listview scrollbar

如果在WPF ListView的基础集合发生更改时如何正确调整滚动条的大小?

我有一个WPF ListView绑定到一个具有数千个项目的可观察集合。当删除大量这些视图时,视图似乎只显示最后一项。当我使用拇指条在视图中移动位置时,缩略图会调整大小以反映新的集合大小。当集合发生变化时,是否可以强制ListView和滚动条同步?

3 个答案:

答案 0 :(得分:2)

如果有其他人遇到这个问题我找到了解决办法。

以下代码示例显示第一行更改了ListView bening的项目源。以下行显示了回滚到第一个项目的解决方法。

this.ListViewResults.ItemsSource = this.itemsFiltered;

object firstItem = this.ListViewResults.Items.GetItemAt(0);

if(firstItem == null)
{
    return;
}

this.ListViewResults.ScrollIntoView(firstItem);

答案 1 :(得分:0)

奇怪的行为!!

我会尝试将ListView的绑定上下文(Context)设置为null,然后再次使用相同的列表来刷新绑定。

答案 2 :(得分:0)

我有一个不同的解决方法,需要继承ListView。这是一个更多的工作,但结果比滚动到第一项更好。但是您需要调整ListView模板,使模板中的ScrollViewer具有名称(此处为PART_ScrollViewer),或者您使用其他方式获取ScrollViewer对象。

public class BetterListView : ListView
{
    ScrollViewer sv;
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
       //Get the scrollviewer in the template (I adapted the ListView template such that the ScrollViewer has a name property)
       sv = (this.Template.FindName("PART_ScrollViewer", this)) as ScrollViewer;
    }

    protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
    {
        base.OnItemsChanged(e);
        //Prevent the bug where the ListView doesn't scroll correctly when a lot of items are removed
        if (sv != null && e.Action == NotifyCollectionChangedAction.Remove)
        {
            sv.InvalidateScrollInfo();
        }
    }
}