WPF отключает связывание ключей по умолчанию в DataGrid (как если бы оно никогда не определялось) - PullRequest
1 голос
/ 24 мая 2019

Я бы хотел отключить некоторые стандартные поведения клавиш DataGrid, чтобы переопределить его своими собственными улучшенными командами.Как отключить привязки клавиш DataGrid, как если бы они никогда не определялись?

Например, клавиша Enter по умолчанию переходит на новую строку, вместо этого я бы хотел сосредоточить внимание на элементе управления деталями.,Остановить событие достаточно просто с помощью this.handled = true;, что, тем не менее, также предотвращает появление любых пользовательских Command с, минимальный пример проблемы:

public partial class MainWindow : Window
{
    public class Model {
        public string Name { get; set; }
        public int Value { get; set; }
    }

    public class TestCommand : ICommand {
        public event EventHandler CanExecuteChanged;
        public bool CanExecute(object parameter) => true;
        public void Execute(object parameter) => MessageBox.Show("Command invoked");
    }

    public ICommand EnterCommand { get; } = new TestCommand();
    public IEnumerable<Model> Items {
        get { return new List<Model>() {
                new Model { Name = "Foo", Value = 15 },
                new Model { Name = "Bar", Value = 1 },
                new Model { Name = "Baz", Value = 42 },
                new Model { Name = "Bar", Value = 100 } }; }
    }

    public MainWindow() { InitializeComponent(); }

    private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter) e.Handled = true;
    }
}

//MainWindow.xaml, Window.Name = "Root"
<Window.InputBindings>
    <KeyBinding Key="Enter" Command="{Binding EnterCommand, ElementName=Root}"/>
</Window.InputBindings>
<DataGrid ItemsSource="{Binding Items, ElementName=Root}" PreviewKeyDown="DataGrid_PreviewKeyDown"/>

Когда нажата клавиша Enter, когда фокус данных находится в сетке., EnterCommand должен вызываться через <KeyBinding/>, т. Е. без явной ссылки в codebehind (ViewModel опущено для пивоварения), а поведение DataGrid по умолчанию запрещено, т.е. не переходить к следующей строке.

1 Ответ

1 голос
/ 24 мая 2019

Вы можете программно вызвать другое событие KeyDownEvent после обработки события DataGrid PreviewKeyDown:

private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        e.Handled = true;
        RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, PresentationSource.FromVisual(this), 0, Key.Enter)
        {
            RoutedEvent = Keyboard.KeyDownEvent
        });
    }
}
...