我有两个数据网格并排绑定到不同的数据表,每个数据表都有自己的视图。
数据表的行数相同,我希望两个网格都保持相同的滚动位置。
我很难找到使用MVVM做到这一点的方法......任何人都有任何想法吗?
谢谢! -Steven
答案 0 :(得分:8)
查看codeproject Scroll Synchronization
答案 1 :(得分:6)
我能够通过一些反思黑客来解决这个问题:
<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);
}
}
}
答案 2 :(得分:2)
Scroll Synchronization项目不适用于Datagrid,因为它不会公开ScrollToVerticalOffset
答案 3 :(得分:0)
到目前为止,我使用的最佳方法是使用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类并将其直接传递给此函数。
快乐编程:)