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