Как привязать KeyUp / вниз к событию нажатия кнопки? - PullRequest
2 голосов
/ 27 августа 2010

Предположим, у меня есть пользовательский контроль с текстовым полем, списком, кнопкой, ... внутри этого элемента управления.

Button1 привязан к ICommand в модели представления.

Мой запрос таков: когда пользователь нажимает клавишу Enter в любом поле, например в любом текстовом поле, в поле со списком, он запускает событие Button1 Click, поэтому вызывается ICommand.

Как это реализовать?

Ответы [ 2 ]

3 голосов
/ 28 августа 2010

Я создал простое поведение для такой ситуации

<TextBox Grid.Row="2" x:Name="Tags">
    <i:Interaction.Behaviors>
       <this:KeyEnterCommand Command="{Binding AddTagsCommand}" CommandParameter="{Binding ElementName=Tags}" />
    </i:Interaction.Behaviors>
</TextBox>

Код поведения:

public class KeyEnterCommand : Behavior<Control>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.KeyDown += KeyDown;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.KeyDown -= KeyDown;
    }

    void KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        if (e.Key == System.Windows.Input.Key.Enter && Command != null)
        {
            Command.Execute(CommandParameter);
        }
    }

    #region Command (DependencyProperty)

    /// <summary>
    /// Command
    /// </summary>
    public ICommand Command
    {
        get { return (ICommand)GetValue(CommandProperty); }
        set { SetValue(CommandProperty, value); }
    }
    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.Register("Command", typeof(ICommand), typeof(KeyEnterCommand),
            new PropertyMetadata(null));

    #endregion

    #region CommandParameter (DependencyProperty)

    /// <summary>
    /// CommandParameter
    /// </summary>
    public object CommandParameter
    {
        get { return (object)GetValue(CommandParameterProperty); }
        set { SetValue(CommandParameterProperty, value); }
    }
    public static readonly DependencyProperty CommandParameterProperty =
        DependencyProperty.Register("CommandParameter", typeof(object), typeof(KeyEnterCommand),
            new PropertyMetadata(null));


    #endregion
}
0 голосов
/ 27 августа 2010

Добавить свойство зависимости в UserControl: -

public ICommand EnterKeyCommand
{
    get { return GetValue(EnterKeyCommandProperty) as ICommand; }
    set { SetValue(EnterKeyCommandProperty, value); }
}

public static readonly DependencyProperty EnterKeyCommandProperty =
        DependencyProperty.Register(
                "EnterKeyCommand",
                typeof(ICommand),
                typeof(MyControl),
                null);

Присоедините обработчик для события Keyup в UserControl, используя метод AddHandler: -

void MyControl()
{

    InitializeComponent();
    this.AddHandler(UIElement.KeyUpEvent, new KeyEventHandler(UserControl_KeyUp), true);  //Note that last parameter important
}

void UserControl_KeyUp(object sender, KeyEventArgs e)
{
   if (e.Key == Key.Enter && EnterKeyCommand != null && EnterKeyCommand.CanExecute(null))
   {
       EnterKeyCommand.Execute(null);
   }

}

Обратите внимание, что смысл в том, что использование AddHandler позволяет вам перехватить событие, которое уже было обработано.

Также обратите внимание, что это упрощено для ясности. В действительности вы также хотели бы реализовать другое свойство зависимости для параметра Command и передать его в CanExecute и Execute вместо null. Вам также необходимо определить, является ли OriginalSource TextBox, для которого AcceptsReturn имеет значение true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...