Я добился определенного прогресса в этом.В приведенном выше коде вся сетка была оставлена в недоступном для редактирования состоянии.Теперь это оставляет фокус на последней ячейке в моем столбце и позволяет мне отправлять данные с помощью сканирующего пистолета.
Кажется, это работает, но я все равно буду благодарен за отзыв о том, есть ли лучший способ.
private void dummyCell_MoveToNextColumn(object sender, RoutedEventArgs e) {
e.Handled = true;
// Cell is the model object containing the parsing rules and raising events
var lSender = sender as Cell;
var gridItems = ViewGridReference.Items;
var lastItem = gridItems[gridItems.Count - 1];
if (lSender == lastItem) {
// We are at the bottom of the column
// Move the program on to the next column
CurrentColumn++;
OnPropertyChanged("ItemPositions");
} else {
// Simulate "empty position" input for this cell and all cells down the column
// Cells are validating themselves as the simulation progresses
foreach (Cell item in ViewGridReference.Items) {
item.ActualItemCode = string.Empty;
}
ViewGridReference.SelectedIndex = gridItems.Count - 1;
ViewGridReference.CurrentCell = new DataGridCellInfo(lastItem, ViewGridReference.Columns[0]);
(ViewGridReference.ItemsSource as ListCollectionView).EditItem(ViewGridReference.SelectedItem);
((DataGridCell)ViewGridReference.SelectedItem).Focus();
}
}
Обновлено 12.02.2010
Эй, есть важное обновление для этого.Первое, на что следует обратить внимание, это то, что в моем сценарии ввод текста осуществляется с помощью сканирующего пистолета, поэтому клавиши «Ввод» отправляются при каждом нажатии триггера.Он сбрасывает каждый символ, за которым сразу следует клавиша Enter.
WPF видит этот ввод и хочет установить фокус на DataGridCell непосредственно под ячейкой, в которую был получен ввод с помощью клавиши Enter.Приведенный выше код устанавливает фокус на последнюю ячейку, но затем событие клавиши Enter все еще срабатывает и обрабатывается DataGrid после запуска этого кода.В результате фокус возвращается к следующей ячейке, а не к последней, как я хочу.
Так что мне нужно либо выяснить, как использовать клавишу Enter для этого сканирования, либо мне нужносломать, как WPF обрабатывает клавиши ввода.Последняя строка там на самом деле выдает исключение.Мы пытаемся использовать класс Model (Class.cs) в качестве DataGridCell, и нет ничего, что могло бы справиться с этим приведением.Из-за этого метод Focus () пытается работать с нулевым объектом, и мы получаем исключение NullReferenceException.Это действительно смущало меня, потому что Visual Studio 2010 иногда ломался, чтобы предупредить меня об этом, но иногда это не сработало.Однако, если я запускаю исполняемый файл вне Visual Studio, он работает просто отлично.Это связано с тем, что необработанные, нефатальные исключения игнорируются и поведение клавиши Enter не работает как обычно.
Так что это работает, но довольно грубо.Мне нужно либо выяснить, как выполнить однократную обработку клавиши Enter и переопределить обработчик WPF по умолчанию, либо просто оставить все как есть и поморщиться.