ScrollViewer для динамического извлечения новых строк при достижении дна - PullRequest
2 голосов
/ 25 января 2011

Я хочу создать средство прокрутки, которое отображает вертикальную полосу прокрутки независимо от того, есть ли у нее элементы для прокрутки вниз или нет. Делая это, я стремлюсь динамически извлекать больше данных из базы данных, когда пользователь прокручивает вниз. Данные хранятся в сетке данных (dgGrid) и оборачиваются средством просмотра прокрутки (svMain) (см. Ниже). Данные из базы данных извлекаются с использованием метода, который запускает событие ScrollViewer.ScrollChanged.

<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>

Проблема заключается в том, что, хотя я установил свойство VerticalScrollBarVisibility средства просмотра scrollviewer в видимое состояние (и вертикальная полоса прокрутки отображается постоянно), полоса прокрутки отключена, и при наличии количества данных в сетке данных не отображается большой палец прокрутки соответствует высоте экрана. Если я изменю размер экрана до меньшего размера, активируется вертикальная полоса прокрутки, и я могу перемещать большой палец вокруг. Однако я хочу, чтобы полоса прокрутки и ее большой палец были включены независимо от того, может ли содержимое области просмотра соответствовать его содержимому или нет. Кто-нибудь может помочь с этим?

Спасибо!

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Я не эксперт в WPF, но после прочтения поста я могу предложить вам оставить высоту scrollviewer меньше его содержимого, чтобы вы увидели, что вертикальная полоса прокрутки включена.

0 голосов
/ 25 января 2011

Вы можете поиграть с Интерфейс ICollectionView . Каждый раз, когда IEnumerable привязывается к ItemsControl, представление по умолчанию неявно вставляется между исходным и целевым объектами. Он отслеживает текущий элемент, поддерживает сортировку, группировку и т. Д. Вы можете реализовать собственный Просмотр коллекции, который поддерживает загрузку дополнительных элементов при достижении последнего элемента.

0 голосов
/ 25 января 2011

По умолчанию DataGrid использует виртуализацию, поэтому новые элементы будут только инициализироваться, отображаться и т. Д. При их отображении. Это будет работать только при использовании элементов управления прокрутки по умолчанию DataGrid.

Вы могли бы сделать

select count(*) from yourDbTable

для заполнения списка фиктивными объектами, которые знают, как получить свои данные.

Вы также можете добавить в конец списка элемент, который будет извлекать дополнительные элементы при доступе к одному из его свойств.

Остальные события, связанные с привязкой и изменением коллекции, должны делать все остальное.

...