WPF/MVVM:在不同视图中同步滚动两个数据网格
问题描述:
我有两个并排绑定到不同数据表的DataGrid,每个都有自己的视图。WPF/MVVM:在不同视图中同步滚动两个数据网格
数据表都具有相同的行数,我希望两个网格都保持相同的滚动位置。
我无法找到一种方法来使用MVVM做到这一点......任何人有任何想法?
谢谢! -Steven
答
的滚动同步项目不适合Datagrid的工作,因为它不公开ScrollToVerticalOffset
答
我能够通过一些反映黑客来解决这个问题:
<DataGrid Name="DataGrid1" ScrollViewer.ScrollChanged="DataGrid1_ScrollChanged" />
<DataGrid Name="DataGrid2" />
和代码本身是:
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);
}
}
}
+1
+1反射黑客。将其与codeproject文章一起使用以实现WPF Datagrid的工作附属属性实现 – 2012-02-07 13:23:30
答
我迄今使用的最佳方式是使用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;
}
注:我通常使用列表框类,并直接把它传递给这个函数。
快乐编程:)
感谢您的快速响应!这正是我正在寻找的,已经实施并正在工作:) – stevosaurus 2010-05-14 20:30:44