Comando para WPF TextBox que se activa cuando presionamos la tecla Enter


76

Es muy fácil vincular Buttoncorreos electrónicos en aplicaciones WPF a correos electrónicos Commanden una VIEWMODELclase. Me gustaría lograr un enlace similar para a TextBox.

Tengo un TextBoxy necesito unirlo a un Commandque se enciende cuando golpeo Entermientras el TextBoxestá enfocado. Actualmente, estoy usando el siguiente controlador para el KeyUpevento, pero se ve feo ... y no puedo ponerlo en mi VIEWMODELclase.

private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key == System.Windows.Input.Key.Enter)
    {
        // your event handler here
        e.Handled = true;
        MessageBox.Show("Enter Key is pressed!");
    }
}

¿Hay una mejor manera de hacer esto?

Respuestas:


20

Ario, no todos los objetos de WPF admiten comandos. Entonces, si no desea hacer eso, deberá llamar a su modelo de vista desde su código detrás (un poco acoplado) o usar alguna implementación de mensajería MVVM para desacoplar eso. Consulte el kit de herramientas MVVM Light Messaging para ver un ejemplo. O simplemente use disparadores como este:

<TextBox>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="KeyUp">
            <i:InvokeDataCommand Command="{Binding MyCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

Ok, muchas gracias por responder ... pero este comando se activará en cada evento de activación de tecla o simplemente en un evento de activación de tecla ENTER.
Aryan SuryaWansi

Cada vez. Si no solo desea ingresar, tendrá que escribir una extensión de marcado para hacer eso, como esta: tomlev2.wordpress.com/2009/03/17/…
Erre Efe

3
Vea este es el buen ejemplo que he encontrado aquí
Aryan SuryaWansi

1
Gracias. El activador del evento actual es <i: InvokeCommandAction Command = "{Binding QuickSearchTextKeyUp}" />
Nexxas

cómo aplicar este disparador en varios cuadros de texto
Meer

236

Me enfrenté al mismo problema y encontré una solución aquí , aquí está el ejemplo de código:

<TextBox>
  <TextBox.InputBindings>
    <KeyBinding Command="{Binding Path=CmdSomething}" Key="Enter" />
  </TextBox.InputBindings>
</TextBox>

16
NB, es posible que deba configurar UpdateSourceTrigger=PropertyChangedsu enlace TextBox para que esto funcione.
Richard Dingwall

eso es estúpido fácil. excepto que no funciona para AutoCompleteBox desde el kit de herramientas de WPF; para eso, consulte este stackoverflow.com/questions/4996731
Simon_Weaver

4
Richard Dingwall dice la terrible verdad. lo que necesitamos son 2 cosas: (1) Button.IsDefault = "True" (2) TextBox Text Binding agregue "UpdateSourceTrigger = PropertyChanged". nada mas. incluso la respuesta de sarh no debe usarse.
Haiyuan Li

1
@HaiyuanLi: Button.IsDefaultno ayuda mucho, si cada cuadro de texto debe activar un botón diferente y / o comando enlazado.
Ben Voigt

Esto no funciona en absoluto. 'UpdateSourceTrigger' se establece en 'PropertyChanged'. Utilizo el mismo comando para un botón en la misma cuadrícula pero el cuadro de texto no lo activa.
Matthis Kohli

16

Me gusta la respuesta de Sarh, pero no funcionaría en mi programa, a menos que cambie Entera Return:

<TextBox>
    <TextBox.InputBindings>
        <KeyBinding Key="Return" Command="{}" />
   </TextBox.InputBindings>
</TextBox>

Hice la misma experiencia
Heinz Kessler

1
<TextBox Text="{Binding FieldThatIAmBindingToo, UpdateSourceTrigger=PropertyChanged}">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding AddCommand}" Key="Return" />
    </TextBox.InputBindings>
</TextBox>

Tomé respuesta desde aquí


-9

Puede establecer true en la propiedad AcceptReturn.

 <TextBox AcceptsReturn="True" />

12
Todo lo que esto hace es permitir que el cuadro de texto sea multilínea y maneje la pulsación de tecla en sí, en lugar de activar la acción predeterminada del botón.
Rudi Visser
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.