Датагрид MVVM Прокрутите в поле зрения - PullRequest
7 голосов
/ 26 января 2011

Привет,

Мне удалось прокрутить до выбранного элемента, используя http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM.aspx, но он прокручивается только до тех пор, пока не доберется до выбранного элемента.

Я хочу, чтобы выбранный элемент отображался в верхней части таблицы данных, в настоящее время он отображается в нижней части таблицы данных.

Есть ли способ сделать это?

Ответы [ 3 ]

7 голосов
/ 26 января 2011

Кажется, здесь есть два сценария.Один из них - когда вы вручную выбираете элемент в DataGrid, а другой - когда свойство источника для SelectedItem изменяется в вашей модели представления.Поведение в указанной вами ссылке будет срабатывать для обоих.

Способ работы ScrollIntoView заключается в том, что он будет прокручиваться вверх, если новый выбранный элемент находится выше ранее выбранного элемента (оставляя его сверху), и прокручиватьвниз, если новый выбранный элемент находится ниже (оставляя его внизу), и прокрутки нет вообще, если выбранный элемент уже виден пользователю.Таким образом, вы не всегда получите выбранный элемент в нижней части DataGrid

. Если вы хотите, чтобы SelectedItem всегда отображался в верхней части сетки (если это возможно), вы можете сделать это с помощьюпрокручиваем вниз, перед тем как сделать grid.ScrollIntoView(grid.SelectedItem, null);.Это имеет побочный эффект: SelectedItem будет всегда отображаться сверху, даже если он был выбран мышью, клавиатурой и т. Д.

Чтобы иметь возможность прокручивать DataGrid программно, вам нужно создать ScrollableDataGrid, который получается из DataGrid

public class ScrollableDataGrid : DataGrid
{
    private IScrollProvider m_scrollProvider;
    public ScrollableDataGrid()
    {
        m_scrollProvider = OnCreateAutomationPeer() as IScrollProvider;
    }
    public void ScrollToBottom()
    {
        while (m_scrollProvider.VerticalScrollPercent < 100)
        {
            m_scrollProvider.Scroll(ScrollAmount.NoAmount, ScrollAmount.LargeIncrement);
        }
    }
}

Затем вы можете немного изменить поведение, чтобы получить эффект "прокрутки вверх"

void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (sender is ScrollableDataGrid)
    {
        ScrollableDataGrid grid = (sender as ScrollableDataGrid);

        if (grid.SelectedItem != null)
        {
            grid.Dispatcher.BeginInvoke(delegate
            {
                grid.ScrollToBottom();
                grid.UpdateLayout();
                grid.ScrollIntoView(grid.SelectedItem, null);
            });
        }
    }
}
0 голосов
/ 15 февраля 2014
void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (sender is DataGrid)
        {
            DataGrid grid = (sender as DataGrid);
            if (grid.SelectedItems.Count > 1) // <-------- Add row
                return; //<-------- Add row
            if (grid.SelectedItem != null)
            {
                grid.Dispatcher.BeginInvoke(new Action (delegate()
                {                        
                    grid.UpdateLayout();
                    grid.ScrollIntoView(grid.SelectedItem, null);

                }));
            }
        }
    }
0 голосов
/ 22 октября 2011

Для сетки данных, где вы знаете номер записи:

в объявлениях вашего модуля ....

Dim dv As DataView

Dim cm As CurrencyManager

в вашем коде, где вы определяете свою сетку данных ....

DataGrid1.DataSource = ds.Tables("JoinedTables").DefaultView

dv = New DataView(ds.Tables("JoinedTables"))

cm = CType(Me.BindingContext(dv), CurrencyManager)

, если вы хотите, чтобы номер вашей записи был самым верхним

Public Sub SetPosition(ByVal recordnumber As Integer)

     On Error Resume Next

     'set position to bottom of grid 
     DataGrid1.CurrentRowIndex = ds.Tables(0).Rows.Count
     DataGrid1.Update()

     'set position at record number
     DataGrid1.CurrentRowIndex = recordnumber
     cm.Position = recordnumber

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