Есть два вопроса с ответом user2134678. Один из них очень незначительный и не имеет функционального эффекта. Другой довольно значителен.
Первая проблема заключается в том, что GotFocus фактически вызывается против DataGrid, а не DataGridCell на практике. Спецификатор DataGridCell в XAML является избыточным.
Основная проблема, которую я нашел с ответом, заключается в том, что поведение клавиши ввода нарушено. Enter должен переместить вас в следующую ячейку ниже текущей ячейки в обычном поведении DataGrid. Однако, что на самом деле происходит за кулисами, событие GotFocus будет вызываться дважды. Однажды на текущей ячейке, теряющей фокус, и однажды на новую ячейку, получающую фокус. Но до тех пор, пока BeginEdit вызывается в этой первой ячейке, следующая ячейка никогда не будет активирована. Результат заключается в том, что вы редактируете один клик, но любой, кто буквально не щелкает по сетке, будет неудовлетворен, а разработчик пользовательского интерфейса не должен предполагать, что все пользователи используют мыши. (Пользователи клавиатуры могут обойти это, используя Tab, но это все равно означает, что они прыгают через обручи, которые им не нужны.)
Итак, решение этой проблемы? Обработать событие KeyDown для ячейки, и если клавиша - клавиша Enter, установите флаг, который останавливает BeginEdit от включения в первую ячейку. Теперь клавиша Enter ведет себя так, как должна.
Для начала, добавьте следующий стиль Вашей DataGrid:
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}" x:Key="SingleClickEditingCellStyle">
<EventSetter Event="KeyDown" Handler="DataGridCell_KeyDown" />
</Style>
</DataGrid.Resources>
Примените этот стиль «CellStyle» свойство столбцы, для которых вы хотите включить в один клик.
Затем в коде позади вас есть следующие в обработчике GotFocus (обратите внимание, что я использую VB здесь, потому что это то, что наш «один клик сетки данных запроса» клиент хотел в качестве языка разработки):
Private _endEditing As Boolean = False
Private Sub DataGrid_GotFocus(ByVal sender As Object, ByVal e As RoutedEventArgs)
If Me._endEditing Then
Me._endEditing = False
Return
End If
Dim cell = TryCast(e.OriginalSource, DataGridCell)
If cell Is Nothing Then
Return
End If
If cell.IsReadOnly Then
Return
End If
DirectCast(sender, DataGrid).BeginEdit(e)
.
.
.
Затем добавьте обработчик для события KeyDown:
Private Sub DataGridCell_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
If e.Key = Key.Enter Then
Me._endEditing = True
End If
End Sub
Теперь у вас есть DataGrid, который не изменился никакого принципиального поведения реализации вне-коробки и все же поддерживает одним нажатием кнопки редактирования ,
Вы используете DataGrid, найденный в WPF Toolkit? –
Не могли бы вы дать нам немного больше информации о том, что вы пробовали и как это не работает? –