Событие Silverlight KeyDown в поведении - PullRequest
2 голосов
/ 14 февраля 2011

В моем элементе управления Silverlight 4 DataGrid я хотел добавить очень простое поведение, которое выполняет пользовательскую команду для клавиши. Нажмите - фактически, зафиксируйте выбранный элемент в сетке данных при нажатии клавиши ВВОД.

ПокаПоведение на самом деле работает (см. мой код ...

//.... in "OnAttached()..."
this.AssociatedObject.AddHandler(Control.KeyDownEvent, new KeyEventHandler(OnKeyDown), true);

private void OnKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            InvokeCommand();
        }
    }

...) У меня есть проблема, что DataGrid, кажется, обрабатывает нажатие клавиши ВВОД сам и переходит к следующей строке.Очевидно, что происходит то, что неверная строка фиксируется, потому что когда я обрабатываю нажатие клавиши, выбранная строка уже изменилась.

Вот код XAML:

<data:DataGrid
      AutoGenerateColumns="False"
      IsReadOnly="True"
      ItemsSource="{Binding Path=Data}"
      SelectedItem="{Binding SelectedRow, Mode=TwoWay}">
   <data:DataGrid.Columns>
      <data:DataGridTextColumn Binding="{Binding A}" />
      <data:DataGridTextColumn Binding="{Binding B}" />
      <data:DataGridTextColumn Binding="{Binding C}" />
   </data:DataGrid.Columns>
   <i:Interaction.Behaviors>
      <behaviors:EnterBehavior Command="{Binding CommitCommand}" />
   </i:Interaction.Behaviors>
</data:DataGrid>

Можете ли вы сказать,Как я могу предотвратить событие ENTER по умолчанию?

Ответы [ 3 ]

4 голосов
/ 07 марта 2011

Думаю, сейчас уже немного поздно, чтобы помочь оператору, но я решил эту проблему путем создания подкласса таблицы данных и переопределения метода KeyDown, чтобы установить для e.Handled значение true. Это останавливает обработку ввода по умолчанию для DataGrid, после чего ваши собственные действия могут вступить в силу.

(Очевидно, вы должны заменить экземпляры DataGrid в XAML на YourCustomDataGrid)

public class YourCustomDataGrid : DataGrid
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        // Stop "Enter" selecting the next row in the grid
        if (e.Key == Key.Enter)
        {
            e.Handled = true;
        }
        base.OnKeyDown(e);
    }
}
1 голос
/ 19 декабря 2011

Не полагайтесь на SelectedRow, используйте строку, которая вызвала событие в первую очередь, в качестве параметра для операции отправки. Смотрите код ниже:

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
        InvokeCommand(e.OriginalSource); 
    }
}
0 голосов
/ 21 февраля 2011

Посмотрите, может ли здесь использоваться перегрузка AddHandler с handledEvents.В некоторых случаях это позволяет вам вызывать ваш обработчик, даже если предыдущий обработчик уже установил handled = true.

...