Befehl für WPF TextBox, der ausgelöst wird, wenn wir die Eingabetaste drücken


76

Es ist sehr einfach, Buttons in WPF-Apps an Commands in einer VIEWMODELKlasse zu binden . Ich möchte eine ähnliche Bindung für a erreichen TextBox.

Ich habe ein TextBoxund ich muss es an ein binden, Commanddas ausgelöst wird, wenn ich treffe, Enterwährend das TextBoxfokussiert ist. Derzeit verwende ich den folgenden Handler für das KeyUpEreignis, aber es sieht hässlich aus ... und ich kann es nicht in meine VIEWMODELKlasse aufnehmen.

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!");
    }
}

Gibt es einen besseren Weg, dies zu tun?

Antworten:


20

Arisch, nicht jedes WPF-Objekt unterstützt Befehle. Wenn Sie dies nicht tun möchten, müssen Sie entweder Ihr Ansichtsmodell von Ihrem Code aus aufrufen (ein wenig gekoppelt) oder eine MVVM-Messaging-Implementierung verwenden, um dies zu entkoppeln. Ein Beispiel finden Sie im MVVM Light Messaging-Toolkit . Oder einfach zu verwendende Trigger wie folgt:

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

Ok, vielen Dank für die Antwort ... aber dieser Befehl wird bei jedem Key-Up-Ereignis oder nur bei einem ENTER-Key-Up-Ereignis ausgelöst?
Aryan SuryaWansi

Jedes Mal. Wenn Sie nicht nur für die Eingabe möchten, müssen Sie eine Markup-Erweiterung schreiben, um dies zu tun, wie diese: tomlev2.wordpress.com/2009/03/17/…
Erre Efe

3
Sehen Sie, dies ist das schöne Beispiel, das ich hier gefunden habe
Aryan SuryaWansi

1
Vielen Dank. Der aktuelle Ereignisauslöser ist <i: InvokeCommandAction Command = "{Binding QuickSearchTextKeyUp}" />
Nexxas

wie man diesen Auslöser auf mehrere Textfelder anwendet
Meer

235

Ich habe mit dem gleichen Problem konfrontiert und hier eine Lösung gefunden . Hier ist das Codebeispiel:

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

16
UpdateSourceTrigger=PropertyChangedHinweis: Möglicherweise müssen Sie Ihre TextBox-Bindung festlegen, damit dies funktioniert.
Richard Dingwall

das ist blöd einfach. außer es funktioniert nicht für AutoCompleteBox aus dem WPF Toolkit - dazu siehe stackoverflow.com/questions/4996731
Simon_Weaver

4
Richard Dingwall sagt die schreckliche Wahrheit. Was wir brauchen, sind 2 Dinge: (1) Button.IsDefault = "True" (2) TextBox Textbindung füge "UpdateSourceTrigger = PropertyChanged" hinzu. nichts mehr. Sogar Sarhs Antwort sollte nicht verwendet werden.
Haiyuan Li

1
@HaiyuanLi: Button.IsDefaulthilft nicht viel, wenn jedes Textfeld eine andere Schaltfläche und / oder einen anderen gebundenen Befehl auslösen soll.
Ben Voigt

Das funktioniert überhaupt nicht. 'UpdateSourceTrigger' ist auf 'PropertyChanged' gesetzt. Ich verwende denselben Befehl für eine Schaltfläche im selben Raster, aber das Textfeld löst ihn nicht aus.
Matthis Kohli

16

Ich mag Sarhs Antwort, aber sie würde in meinem Programm nicht funktionieren, wenn ich nicht Enterzu Return:

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

Ich habe die gleiche Erfahrung gemacht
Heinz Kessler

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

Ich nahm die Antwort von hier


-9

Sie können true auf die AcceptReturn-Eigenschaft setzen.

 <TextBox AcceptsReturn="True" />

12
Dies ermöglicht lediglich, dass das Textfeld mehrzeilig ist und den Tastendruck selbst verarbeitet, anstatt die Standardschaltflächenaktion auszulösen.
Rudi Visser
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.