Я бы хотел отключить некоторые стандартные поведения клавиш 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 по умолчанию запрещено, т.е. не переходить к следующей строке.