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类并将其直接传递给此函数。
快乐编程:)