我有一个可能显示多行数据的DataGrid(> 1,000,000),因此我尝试实现一种机制,当用户在当前数据底部附近滚动时,该机制将加载数据。我认为我已经正确实现了它,但是我看到一个特殊的问题,如果我在我的鼠标周围使用滚轮来获取下一页数据,那么视口将自动转到下一个底部附近刚刚加载的页面。每次都不会发生这种情况,使用键盘浏览DataGrid时也不会发生这种情况。
我在下面添加了简化代码,可以重现我的问题。请注意,我使用BinderList和DataTable作为ItemsSource,具有相同的效果。此外,我知道我在这里没有任何保护措施来触及数据源的末尾,我也没有很多生产代码需要的检查。这主要是概念代码的证明。
C#:
public partial class MainWindow : Window
{
public ObservableCollection<int> TableData
{
get
{
return _myTable;
}
}
...
private void DG1_LoadingRow(object sender, DataGridRowEventArgs e)
{
if (_currentRow - RowBufferSize < e.Row.GetIndex())
{
AddPageToTable();
}
}
private bool AddPageToTable()
{
for (int i = 0; i < PageSize; i++)
{
_myTable.Add(_newDataEnumerator.Current);
_newDataEnumerator.MoveNext();
_currentRow++;
}
return true;
}
}
XAML:
<DataGrid Name="DG1" ItemsSource="{Binding TableData}" AutoGenerateColumns="True" LoadingRow="DG1_LoadingRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Data" Binding="{Binding}" Width="400"/>
</DataGrid.Columns>
</DataGrid>
导致这种随机跳过的错误是什么,或者我有什么办法阻止视口转移到我身上?