Обновление WPF DataGrid без потери фокуса ячейки - PullRequest
8 голосов
/ 26 марта 2011

У меня есть WPF DataGrid с некоторыми данными, привязанными к классам сущностей LINQ to SQL.Один столбец - это часы, показывающие летное время данного полета, которое рассчитывается с использованием логики в частичном классе полета.У меня есть таймер, вызывающий datagrid.Items.Refresh каждые 2 секунды для обновления часов.

Обновление работает нормально, но теперь я добавляю сочетания клавиш.Навигация по ячейкам со стрелками клавиатуры работает нормально при выключенном таймере, но при включенном таймере обновления активированная ячейка (на самом деле вся сетка данных) теряет фокус.отключить таймер всякий раз, когда DataGrid сфокусирован.Я даже не могу заставить последнего работать.Я пробовал:

if (!dataGrid.IsFocused)
    dataGrid.Items.Refresh();

и

if (!dataGrid.IsKeyboardFocused)
        dataGrid.Items.Refresh();

для таймера, но эти свойства возвращают значение false, даже когда сетка данных сфокусирована.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 23 января 2013

Лучший способ - не использовать dataGrid.Items.Refresh () в качестве механизма обновления. Похоже, базовые объекты уже обновляются отдельно. Если они реализуют INotifyPropertyChanged, вы должны попытаться установить режим привязки для столбца как TwoWay Binding:

<DataGridTextColumn Binding="{Binding xyz, Mode=TwoWay}"/>
0 голосов
/ 27 февраля 2013

Ваши клетки теряют фокус, потому что вы меняете базовую коллекцию (ItemsSource). Насколько я помню, нет красивого способа получить камеру. Для строки:

Если вы работаете с MVVM, вы можете запомнить ваш SelectedItem или SelectedIndex и восстановить его после перезагрузки с помощью привязки. Это приведет вас в правильный ряд, для начала. Оба имеют разные недостатки:

  • SelectedItem требует немного больше работы. Убедитесь, что вы переопределяете Equals и GetHashCode в базовых объектах, если вы их используете. Если ваш предмет был номером 5 в коллекции, и во время перезагрузки перед ним появляется другая строка, вы все равно окажетесь в правой строке
  • SelectedIndex - самое быстрое решение, но это только числовая позиция. Если вы выберете номер записи 5 и перезагрузка объединится в ряды перед ним, вы получите неправильно выбранную строку.

Как я уже сказал, я не пробовал с клетками, но вы можете прочитать это для начала. Может быть, вы можете применить его к вашей проблеме.

0 голосов
/ 26 марта 2011

Я думаю, вы можете получить текущий фокус и после обновления сетки дать выбранной ячейке обратно фокус, что-то вроде

int index = 11;
myDataGrid.SelectedItem = myDataGrid.Items[index];
myDataGrid.ScrollIntoView(myDataGrid.Items[index]);
DataGridRow dgrow = (DataGridRow)myDataGrid.ItemContainerGenerator.ContainerFromItem(myDataGrid.Items[index]);
dgrow.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

также проверьте это , это может помочь вам

...