重置ItemsSource上的滚动条更改

时间:2011-11-18 13:14:12

标签: wpf binding scrollbar scrollviewer itemssource

每当我更改ItemsSource(或它触发集合重置)时,WPF都不会将ListView / DataGrid的滚动条位置重置为顶部。如果手动执行此操作有一个很好的方法,这没什么大不了的,但似乎没有。

目前我这样做:

ScrollViewer.ScrollToTop();
ScrollViewer.UpdateLayout();
Grid.ItemsSource = Data;

由于UpdateLayout首先重新绘制控件,导致一些闪烁。

另一种方法是:

Grid.ItemsSource = Data;
ScrollViewer.ScrollToTop();

这似乎不会导致任何闪烁,但由于在设置ItemsSource后更改滚动位置,它会导致WPF首先迭代ItemsSource中的错误项目,然后才能获得正确的项目(偏移量为0) 。由于集合是虚拟化的,因此会导致对永远不会显示的项目进行不必要的SQL查询。

有没有其他方法可以先闪烁或检索错误的物品?

1 个答案:

答案 0 :(得分:0)

只是将此事件附加到将保存集合的控件上:

假设它是一个列表框:

lstItems.SourceUpdated += new EventHandler<DataTransferEventArgs>(lstItems_SourceUpdated);

然后你会有一个看起来像这样的事件。

    void lstItems_SourceUpdated(object sender, DataTransferEventArgs e)
    {
        ScrollViewerName.ScrollToTop();
    }