private async Task OnKeyDownAsync(KeyboardEventArgs args) { if (IsEditing) { switch (args.Code) { case "Escape": CancelEdit(); break; case "Enter": case "Return": await CommitEditAsync().ConfigureAwait(true); break; } } else { switch (args.Code) { case "F2": await BeginEditAsync().ConfigureAwait(true); break; case "KeyA": if (args.CtrlKey && SelectionMode == TableSelectionMode.Multiple) { await ClearSelectionAsync().ConfigureAwait(true); Selection.AddRange(ItemsToDisplay.Select(x => KeyField !(x).ToString())); await SelectionChanged.InvokeAsync(null).ConfigureAwait(true); } break; case "ArrowUp": case "ArrowDown": if (Selection.Count == 1 && KeyField != null) { var items = ItemsToDisplay.ToList(); var item = items.Find(x => KeyField(x).ToString() == Selection[0]); if (item != null) { var idx = items.IndexOf(item); if (args.Code == "ArrowUp" && idx > 0) { Selection.Clear(); Selection.Add(KeyField(items[idx - 1]).ToString()); } else if (args.Code == "ArrowDown" && idx < items.Count - 1) { Selection.Clear(); Selection.Add(KeyField(items[idx + 1]).ToString()); } } } break; } } await KeyDown.InvokeAsync(args).ConfigureAwait(true); }