每当我更改ItemsSource(或它触发集合重置)时,WPF都不会将ListView / DataGrid的滚动条位置重置为顶部。如果手动执行此操作有一个很好的方法,这没什么大不了的,但似乎没有。
目前我这样做:
ScrollViewer.ScrollToTop();
ScrollViewer.UpdateLayout();
Grid.ItemsSource = Data;
由于UpdateLayout首先重新绘制控件,导致一些闪烁。
另一种方法是:
Grid.ItemsSource = Data;
ScrollViewer.ScrollToTop();
这似乎不会导致任何闪烁,但由于在设置ItemsSource后更改滚动位置,它会导致WPF首先迭代ItemsSource中的错误项目,然后才能获得正确的项目(偏移量为0) 。由于集合是虚拟化的,因此会导致对永远不会显示的项目进行不必要的SQL查询。
有没有其他方法可以先闪烁或检索错误的物品?
答案 0 :(得分:0)
只是将此事件附加到将保存集合的控件上:
假设它是一个列表框:
lstItems.SourceUpdated += new EventHandler<DataTransferEventArgs>(lstItems_SourceUpdated);
然后你会有一个看起来像这样的事件。
void lstItems_SourceUpdated(object sender, DataTransferEventArgs e)
{
ScrollViewerName.ScrollToTop();
}