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

时间:2010-05-14 19:55:17

标签: c# wpf datagridview datagrid mvvm

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

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

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

谢谢! -Steven

4 个答案:

答案 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类并将其直接传递给此函数。

快乐编程:)