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?

Aryan SuryaWansi
fuente

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>
Erre Efe
fuente
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>
sarh
fuente
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>
Juegos de pesadilla
fuente
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í

Владимир Сонный
fuente
-9

Puede establecer true en la propiedad AcceptReturn.

 <TextBox AcceptsReturn="True" />
Kanimozhi
fuente
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