Search code examples
c#wpfdatagridscrollviewer

Scrolling DataGrid


I use DataGrid with special scrolling, that I search on the internet. Its work OK, but when I modify selecteditem on backcode, rowselection go to selected row, but Scroll is stayed at 1st element so that I not see 20th element if I go to last with my button. In code I used first, prev, next, last button, search index move - but these not communicate with Scroll, Why? This is my navigation:

If I Key.Up, Key.Down that communicate with scroll well, but when I go from 1st to 20th I send 19XKey.Down? I think maybe an easy way, just I not understand. Now my buttons set Mvvm light CollectionViewsource AktItem to next, to last etc, and by SelectedItem, IssynchtonizedCurrent get focus return, but scrolling not move.

Thanks every helps Steve

<ControlTemplate TargetType="{x:Type DataGrid}" x:Key="DataGridWithNavigation">

        <Border BorderBrush="{TemplateBinding BorderBrush}" 
                                    BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" 
                                    Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">

            <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">
                <ScrollViewer.Template>                    
                <ControlTemplate TargetType="{x:Type ScrollViewer}">
                    <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                        <Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" 
                                Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}"                        
                                                        Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
                                                        Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter"
                                                                                Grid.Column="1" 
                                                                                Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                            <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" 
                                                                        CanContentScroll="{TemplateBinding CanContentScroll}" 
                                                                        Grid.ColumnSpan="2" Grid.Row="1"/>
                            <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" 
                                                           Maximum="{TemplateBinding ScrollableHeight}" 
                                                           Orientation="Vertical" Grid.Row="1" 
                                                           Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" 
                                         Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"

                                                           ViewportSize="{TemplateBinding ViewportHeight}"/><!--Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"-->
                        <Grid Grid.Column="1" Grid.Row="2">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <view:BindingNavigatorAreaScroll x:Name="BNA_Scroll" Grid.Column="1"/>
                                <ScrollBar x:Name="PART_HorizontalScrollBar" 
                                                   Grid.Column="2" 
                                                   Maximum="{TemplateBinding ScrollableWidth}" 
                                                   Orientation="Horizontal" 
                                                    Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                                                   Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                                                   ViewportSize="{TemplateBinding ViewportWidth}"
                                                  />
                                <!-- Template="{StaticResource yourCustomTemplate}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"-->
                                <!--<TextBlock  Text="{TemplateBinding ComputedVerticalScrollBarVisibility}"   Grid.Column="2"/>-->
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </ScrollViewer.Template>
                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
            </ScrollViewer>
        </Border>
    </ControlTemplate>

Solution

  • Probably the easiest way to achieve what you want is respond to the click event of the button in your view's code behind using the DataGrid.ScrollIntoView(object) method:

    In XAML:

    <Button Content="Content"
            Click="Button_Click"/>
    

    In CodeBehind:

     private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
            {
                DG.ScrollIntoView(DG.Items[item]);
            }
    

    Where Dg is the Name of the data grid you specify in your XAML and item is the item you want to scroll to.