ScrollViewer在到达底部时动态获取新行

时间:2011-01-25 10:55:32

标签: wpf xaml scrollviewer

我希望创建一个滚动查看器,显示其垂直滚动条,无论它是否有向下滚动的项目。通过这样做,我寻求从用户滚动到底部时动态地从数据库中获取更多数据。数据存储在datagrid(dgGrid)中,并由scrollviewer(svMain)包装(见下文)。使用在ScrollViewer.ScrollChanged事件上触发的方法检索db中的数据。

<ScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Visible" DockPanel.Dock="Top"  Name="svMain" cal:Message.Attach="[Event ScrollChanged] = [Action ScrollMaster($eventArgs)]">
                        <StackPanel>
                            <Grid Visibility="{Binding Path=IsFormView, Converter={StaticResource booleanToVisibilityConverter}}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="200"/>
                                    <ColumnDefinition Width="200"/>
                                    <ColumnDefinition Width="200"/>
                                    <ColumnDefinition Width="200"/>
                                    <ColumnDefinition Width="200"/>
                                </Grid.ColumnDefinitions>

                                <Grid.RowDefinitions>
                                    <RowDefinition />
                                    <RowDefinition />
                                </Grid.RowDefinitions>

                                <StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal">
                                    <CheckBox IsChecked="{Binding MasterDTO.ActiveFlag, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                    <Label Content="Active"/>
                                </StackPanel>

                                <StackPanel Grid.Row="1" Grid.Column="0">
                                    <con:MandatoryLabel Text="Country Id" />
                                    <TextBox Text="{Binding MasterDTO.CountryId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                </StackPanel>
                                <StackPanel Grid.Row="1" Grid.Column="1">
                                    <con:MandatoryLabel Text="Currency"/>
                                    <TextBox Text="{Binding MasterDTO.Currency, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                                </StackPanel>
                            </Grid>

                            <!-- Grid View -->
                            <DockPanel Visibility="{Binding Path=IsGridView, Converter={StaticResource booleanToVisibilityConverter}}">
                                <DataGrid Name="dgGrid" Style="{StaticResource ReadOnlyDatagrid}" SelectedItem="{Binding Path=MasterDTO, Mode=TwoWay}" ItemsSource="{Binding MasterDTOs, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" cal:Message.Attach="[Event SelectionChanged] = [Action GridSelect]">
                                    <DataGrid.Columns>
                                        <DataGridTemplateColumn Header="Active">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <controls:YesNoLabel Value="{Binding ActiveFlag}" />
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                        <DataGridTextColumn Header="Country Id" Binding="{Binding CountryId}"/>
                                        <DataGridTextColumn Header="Currency" Binding="{Binding Currency}"/>
                                    </DataGrid.Columns>
                                </DataGrid>
                            </DockPanel>

                        </StackPanel>
                    </ScrollViewer>

问题在于,即使我将scrollviewer的VerticalScrollBarVisibility属性设置为可见(并且始终显示垂直滚动条),滚动条也会被禁用,并且只要数据网格中的数据量,就没有滚动缩略图可见适合屏幕的高度。如果我将屏幕调整为较小的尺寸,则启用垂直滚动条,我可以移动拇指。但是,我想要启用滚动条及其拇指,无论视口的内容是否可以容纳其内容。任何人都可以提供帮助吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

我不是WPF的专家,但在阅读帖子后我建议你保持scrollviewer的高度低于其内容,这样你就会看到启用了垂直滚动条。

答案 1 :(得分:0)

默认情况下,DataGrid使用虚拟化,因此只有在将新元素放入视图时才会对其进行初始化和渲染等。这仅在使用DataGrid的默认滚动控件时才有效。

你可以做一个

select count(*) from yourDbTable

使用知道如何获取数据的虚拟对象填充列表。

您还可以在列表末尾添加一个元素,以便在访问其中一个属性时获取更多元素。

绑定和集合更改事件应该完成剩下的工作。

答案 2 :(得分:0)

你可以玩ICollectionView Interface。每次将IEnumerable绑定到ItemsControl时,都会在源对象和目标对象之间隐式插入默认视图。它跟踪当前项目,支持排序,分组等。您可以实现一个自己的集合视图,支持在到达最后一个元素时加载更多项目。