WPF / MVVM: синхронная прокрутка двух сетей данных в разных представлениях - PullRequest
8 голосов
/ 14 мая 2010

У меня есть две сетки данных, связанные рядом с разными таблицами данных, и у каждой из них свое представление.

Обе таблицы данных имеют одинаковое количество строк, и я хочу, чтобы обе сетки поддерживали одинаковую позицию прокрутки.

У меня проблемы с поиском способа сделать это с помощью MVVM ... у кого-нибудь есть идеи?

Спасибо! -Steven

Ответы [ 4 ]

8 голосов
/ 15 мая 2010

Посмотрите на кодпроект Синхронизация прокрутки

6 голосов
/ 08 ноября 2010

Мне удалось преодолеть эту проблему с помощью некоторых рефлексов:

<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 голосов
/ 24 августа 2010

Проект синхронизации прокрутки не работает для Datagrid, так как он не предоставляет ScrollToVerticalOffset

0 голосов
/ 26 января 2014

Лучший способ, который я использовал до сих пор, это использовать класс 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 и передаю его непосредственно этой функции.

Счастливого программирования:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...