WPF / MVVM:在不同视图中同步滚动两个数据网格

我有两个数据网格并排绑定到不同的数据表,每个数据表都有自己的视图。

数据表都具有相同的行数,我希望两个网格保持相同的滚动位置。

我很难找到使用MVVM做到这一点的方法……任何人都有任何想法?

谢谢! -Steven

看看codeproject Scroll Synchronization

我能够通过一些反思黑客来解决这个问题:

  

而代码本身是:

  private void DataGrid1_ScrollChanged(object sender, ScrollChangedEventArgs e) { if (e.HorizontalChange != 0.0f) { ScrollViewer sv = null; Type t = DataGrid1.GetType(); try { sv = t.InvokeMember("InternalScrollHost", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty, null, DataGrid2, null) as ScrollViewer; sv.ScrollToHorizontalOffset(e.HorizontalOffset); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } 

Scroll Synchronization项目不适用于Datagrid,因为它不会公开ScrollToVerticalOffset

到目前为止我使用的最好方法是使用VisualTreeHelper类来查找正确的ScrollViewer对象(网格或无网格)。 我在几个项目中使用过它。

如果您有任何需要,请尝试此操作:

 private static bool ScrollToOffset(DependencyObject n, double offset) { bool terminate = false; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(n); i++) { var child = VisualTreeHelper.GetChild(n, i); if (child is ScrollViewer) { (child as ScrollViewer).ScrollToVerticalOffset(offset); return true; } } if (!terminate) for (int i = 0; i < VisualTreeHelper.GetChildrenCount(n); i++) terminate = ScrollToOffset(VisualTreeHelper.GetChild(n, i), offset); return false; } 

注意:我通常使用ListBox类并将其直接传递给此函数。

快乐编程:)