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?

Aryan SuryaWansi
quelle

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>
Erre Efe
quelle
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>
sarh
quelle
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>
Albtraumspiele
quelle
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

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

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

 <TextBox AcceptsReturn="True" />
Kanimozhi
quelle
12
Dies ermöglicht lediglich, dass das Textfeld mehrzeilig ist und den Tastendruck selbst verarbeitet, anstatt die Standardschaltflächenaktion auszulösen.
Rudi Visser