Синхронизируется ли ScrollIntoView в виртуальном стеке (особенно в WPF DataGrid)? - PullRequest
1 голос
/ 30 апреля 2011

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

Верно ли, что мы думаем, что вызов ScrollIntoView синхронизирован, это означает, что после вызова нашей желаемой строки и ячейкисозданы и мы можем установить фокус?(снова это означает, что после вызова ScrollIntoView, правда ли, что мы думаем, что Itemsgenerator завершил свою работу и мы можем найти нашу желаемую ячейку)

$

   //set filter of DataGrid Collection
DataGrid_Standard.ScrollIntoView(rowNumber,cellNumber);
//we sure our desired cell are created now
    DataGridRow row =           (DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(index);
    if (row == null)
    {
        // may be virtualized, bring into view and try again
        DataGrid_Standard.ScrollIntoView(DataGrid_Standard.Items[index]);
        row = (DataGridRow)DataGrid_Standard.ItemContainerGenerator.ContainerFromIndex(index);
    }


        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

        // try to get the cell but it may possibly be virtualized
        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);

            // now try to bring into view and retreive the cell
            DataGrid_Standard.ScrollIntoView(rowContainer, DataGrid_Standard.Columns[column]);
            cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);             cell.focus();

Related

Ответы [ 2 ]

0 голосов
/ 10 апреля 2014
Action action = () =>
      {
        dg .ScrollIntoView(dg .SelectedItem);

        var item = dg.ItemContainerGenerator.ContainerFromIndex(index) as DataGridRow;
        if (item == null) return;

        item.Focus();
      };

      Dispatcher.BeginInvoke(DispatcherPriority.Background, action);

Это должно работать нормально для вашего случая.

0 голосов
/ 25 октября 2011

Вот обработчик событий, измененный в таблице данных, который перемещает виртуализированную строку в представление, а затем устанавливает фокус на эту строку.Это работает для меня:

        private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataGrid dg = (DataGrid)sender;
        if (dg.SelectedItem == null) return;
        dg.ScrollIntoView(dg.SelectedItem);

        DataGridRow dg_row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem);
        if (dg_row == null) return;
       dg_row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

    }

РЕДАКТИРОВАТЬ: Использование метода dg_row.MoveFocus оказало нежелательный эффект (столбец флажок требовал два щелчка, чтобы установить вместо одного), и мне было лучше использовать

dg_row.Focus();
...