Мне необходимо контролировать прокрутку DataGrid, т.е. решать какой элемент должен быть верхним отображаемым. Для этого я хочу использовать либо свойство CurrentItem либо метод ScrollIntoView(). Но все упирается в то, что я не могу получить индекс верхней строки. Есть ли какой-то вариант получить этот индекс?
Asked
Active
Viewed 219 times
0
Ivan Kozlov
- 327
1 Answers
3
Получите ScrollViewer вашего DataGrid:
public MainWindow()
{
InitializeComponent();
Loaded += (o, e) => scrollViewer = GetVisualChild<ScrollViewer>(MyDataGrid);
}
ScrollViewer scrollViewer;
private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = null;
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
var v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null) child = GetVisualChild<T>(v);
if (child != null) break;
}
return child;
}
Что интересно, ScrollViewer внутри DataGrid отсчитывает вертикальное смещение в элементах, а не в координатах (как он обычно это делает).
Перед добавлением новых элементов запомните текущее смещение:
int verticalOffset;
verticalOffset = (int)scrollViewer.VerticalOffset;
А после добавления скорректируйте его (здесь x — количество добавленных элементов):
scrollViewer.ScrollToVerticalOffset(verticalOffset + x);
Андрей NOP
- 28,687

DataGrid. – Ivan Kozlov Aug 28 '18 at 05:53DataGridсдвигает строку на 1 вниз при приходе нового элемента. У меня же при приходе элемента, с помощьюScrollIntoViewвесь грид отматывается наверх. Это необходимо по ТЗ. Типа видишь новые события. Весь вопрос во втором режиме. Когда пользователь просматривает то, что было раньше. – Ivan Kozlov Aug 28 '18 at 05:57ObservableCollectionне перестраивает грид. Кроме явного измененияItemSourceя не могу придумать вариантов – Ivan Kozlov Aug 28 '18 at 06:33ObservableCollectionи сделан (реализацияINotifyCollectionChanged) – Андрей NOP Aug 28 '18 at 06:45ItemsSource="{Binding Path=(local:Messages.MessagesCollection), UpdateSourceTrigger=PropertyChanged}"и само свойство:public static ObservableCollection<Message> MessagesCollection { get { return messages; } set { messages = value; } }– Ivan Kozlov Aug 28 '18 at 06:47ObservableCollectionкак? – Андрей NOP Aug 28 '18 at 06:54TextBlockсо временем нажатия. Вот без обновленияItemSourceшаблон не меняется – Ivan Kozlov Aug 28 '18 at 06:59Messageдолжны реализовыватьINotifyPropertyChanged. "Классический" пример на этом сайте: https://ru.stackoverflow.com/a/573196/218063 Обратите внимание, стрелочки поворачиваются без переназначенияItemsSource– Андрей NOP Aug 28 '18 at 07:10