Есть две проблемы с ответом пользователя 2134678.Один очень незначительный и не имеет функционального эффекта.Другое довольно значимое.
Первая проблема заключается в том, что 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, который не изменил какое-либо фундаментальное поведение вне- встроенная реализация и поддерживает редактирование в один клик.