滚动数据网格

Scrolling DataGrid

我使用在 Internet 上搜索的具有特殊滚动功能的 DataGrid。 它的工作正常,但是当我修改 backcode 上的 selecteditem 时,rowselection 转到选定的行,但是 Scroll 停留在第一个元素,所以如果我用我的按钮走到最后,我看不到第 20 个元素。 在我使用的代码中,first、prev、next、last 按钮、搜索索引移动 - 但这些不与 Scroll 通信,为什么? 这是我的导航:

如果我Key.Up,Key.Down那个和scroll沟通的很好,但是当我从1号到20号的时候我发送19XKey.Down?我想也许是一种简单的方法,只是我不明白。 现在我的按钮将 Mvvm light CollectionViewsource AktItem 设置为下一个,最后一个等等,并且通过 SelectedItem,IssynchtonizedCurrent 获得焦点 return,但滚动不动。

谢谢大家的帮助 史蒂夫

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

实现您想要的效果的最简单方法可能是使用 DataGrid.ScrollIntoView(object) 方法响应视图代码中按钮的单击事件:

在XAML中:

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

在代码隐藏中:

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

其中 Dg 是您在 XAML 中指定的数据网格的 Nameitem 是您要滚动到的项目。