Вы можете обмануть сетку данных, чтобы представить ее ScrollViewer как открытое свойство для каждой сетки, когда, например, обработчик innerGridControl_ScrollChanged () вызывается во время инициализации usercontrol.
Чтобы показать его, вы можете сделать свою сетку в файле xaml View, а затем составить два из них в другом xaml View.
Ниже приведен код для innerGrid.xaml.cs, например:
public ScrollViewer Scroller { get; set; } // exposed ScrollViewer from the grid
private bool _isFirstTimeLoaded = true;
private void innerGridControl_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (_isFirstTimeLoaded) // just to save the code from casting and assignment after 1st time loaded
{
var scroller = (e.OriginalSource) as ScrollViewer;
Scroller = scroller;
_isFirstTimeLoaded = false;
}
}
в OuterGridView.xaml поместите определение прикрепленного обработчика события:
<Views:innerGridView Grid.Row="1" Margin="2,0,2,2" DataContext="{Binding someCollection}"
x:Name="grid1Control"
ScrollViewer.ScrollChanged="Grid1Attached_ScrollChanged"
></Views:innerGridView>
<Views:innerGridView Grid.Row="3" Margin="2,0,2,2" DataContext="{Binding someCollection}"
x:Name="grid2Control"
ScrollViewer.ScrollChanged="Grid2Attached_ScrollChanged"
></Views:innerGridView>
затем получите доступ к общедоступному методу ScrollViewer.SetHorizontOffset (e.Hor horizontalOffset), когда произойдет другое событие прокрутки.
Ниже приведен код в OuterGridView.xaml.cs для одного из определений обработчика (
private void Grid1Attached_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e != null && !e.Handled)
{
if (e.HorizontalChange != 0.0)
{
grid2Control.Scroller.ScrollToHorizontalOffset(e.HorizontalOffset);
}
e.Handled = true;
}
}
private void Grid2Attached_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e != null && !e.Handled)
{
if (e.HorizontalChange != 0.0)
{
grid1Control.Scroller.ScrollToHorizontalOffset(e.HorizontalOffset);
}
e.Handled = true;
}
}
Также убедитесь, что для любого другого события scroll_changed во внутренней сетке (если оно есть, например, если вы определяете TextBox со скроллером по умолчанию в одном из шаблона данных столбца) для e.Handled установлено значение true, чтобы предотвратить обработку обработчиком внешней сетки это (это произошло из-за всплывающего по умолчанию поведения routedevents). В качестве альтернативы вы можете поставить дополнительную проверку, если e.OriginalSource или e.Source отфильтровать событие прокрутки, которое вы собираетесь обрабатывать.