68 Stimmen

Ausführen des Befehls viewmodels bei Eingabe in die TextBox

Ich möchte einen Befehl in meinem Viewmodel ausführen, wenn der Benutzer die Eingabetaste in einer TextBox drückt. Der Befehl funktioniert, wenn er an eine Schaltfläche gebunden ist.

<Button Content="Add" Command="{Binding Path=AddCommand}" />

Aber ich kann nicht bringen es von der TextBox zu arbeiten. Ich habe versucht, eine Inputbinding, aber es hat nicht funktioniert.

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

Ich habe auch versucht, die Arbeitstaste als Standard einzustellen, aber sie wird nicht ausgeführt, wenn die Eingabetaste gedrückt wird.

Vielen Dank für Ihre Hilfe.

3 Stimmen

Würden Sie bitte die akzeptierte Antwort ändern? Ich kann meine Antwort nicht löschen, solange sie angenommen ist.

186voto

mkamioner Punkte 2361

Ich weiß, dass ich zu spät dran bin, aber ich habe es geschafft, dass es bei mir funktioniert. Versuchen Sie es mit Key="Return" anstelle von Key="Enter"

Hier ist das vollständige Beispiel

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

Achten Sie darauf, dass Sie UpdateSourceTrigger=PropertyChanged in Ihrer Bindung, andernfalls wird die Eigenschaft nicht aktualisiert, bis der Fokus verloren geht, und das Drücken der Eingabetaste wird den Fokus nicht verlieren...

Ich hoffe, das war hilfreich!

25 Stimmen

Sie muss als Lösung akzeptiert werden, statt als Antwort mit schrecklichen RegisterAttached

0 Stimmen

@Skynet094 etwa so: AddCommand= new Command(ExecuteAdd); und dann definieren Sie die ExecuteAdd Methode

13voto

Andreas Zita Punkte 6664

Sie haben den Befehl wahrscheinlich nicht zu einer Eigenschaft, sondern zu einem Feld gemacht. Es funktioniert nur, um an Eigenschaften zu binden. Ändern Sie Ihren AddCommand in eine Eigenschaft und es wird funktionieren. (Ihre XAML funktioniert gut für mich mit einer Eigenschaft anstelle eines Feldes für den Befehl -> keine Notwendigkeit für jeden Code hinter!)

2 Stimmen

Einverstanden. <KeyBinding Command="{Binding Path=AddCommand}" Key="Enter"/> hat auch bei mir gut funktioniert!

5voto

Mark Heath Punkte 46572

Hier ist eine angehängte Abhängigkeitseigenschaft, die ich dafür erstellt habe. Es hat den Vorteil, sicherzustellen, dass Ihre Textbindung zurück zum ViewModel aktualisiert wird, bevor der Befehl feuert (nützlich für Silverlight, die nicht die Eigenschaft geändert Update-Quelle Trigger unterstützt).

public static class EnterKeyHelpers
{
    public static ICommand GetEnterKeyCommand(DependencyObject target)
    {
        return (ICommand)target.GetValue(EnterKeyCommandProperty);
    }

    public static void SetEnterKeyCommand(DependencyObject target, ICommand value)
    {
        target.SetValue(EnterKeyCommandProperty, value);
    }

    public static readonly DependencyProperty EnterKeyCommandProperty =
        DependencyProperty.RegisterAttached(
            "EnterKeyCommand",
            typeof(ICommand),
            typeof(EnterKeyHelpers),
            new PropertyMetadata(null, OnEnterKeyCommandChanged));

    static void OnEnterKeyCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        ICommand command = (ICommand)e.NewValue;
        FrameworkElement fe = (FrameworkElement)target;
        Control control = (Control)target;
        control.KeyDown += (s, args) =>
        {
            if (args.Key == Key.Enter)
            {
                // make sure the textbox binding updates its source first
                BindingExpression b = control.GetBindingExpression(TextBox.TextProperty);
                if (b != null)
                {
                    b.UpdateSource();
                }
                command.Execute(null);
            }
        };
    }
}

Sie verwenden es so:

<TextBox 
    Text="{Binding Answer, Mode=TwoWay}" 
    my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}"/>

0 Stimmen

Command könnte hier beim Aufruf von " command.Execute(commandParameter);" null sein.

3voto

Sie müssen Gesture anstelle der Key-Eigenschaft der KeyBinding definieren:

<TextBox.InputBindings>
    <KeyBinding Gesture="Enter" Command="{Binding AddCommand}"/>
</TextBox.InputBindings>

-1voto

T.Y. Kucuk Punkte 347

Zusätzlich zu Mark Heath habe ich die Klasse noch einen Schritt weiter entwickelt, indem ich die Eigenschaft Command Parameter attached auf diese Weise implementiert habe;

public static class EnterKeyHelpers
{
        public static ICommand GetEnterKeyCommand(DependencyObject target)
        {
            return (ICommand)target.GetValue(EnterKeyCommandProperty);
        }

        public static void SetEnterKeyCommand(DependencyObject target, ICommand value)
        {
            target.SetValue(EnterKeyCommandProperty, value);
        }

        public static readonly DependencyProperty EnterKeyCommandProperty =
            DependencyProperty.RegisterAttached(
                "EnterKeyCommand",
                typeof(ICommand),
                typeof(EnterKeyHelpers),
                new PropertyMetadata(null, OnEnterKeyCommandChanged));

        public static object GetEnterKeyCommandParam(DependencyObject target)
        {
            return (object)target.GetValue(EnterKeyCommandParamProperty);
        }

        public static void SetEnterKeyCommandParam(DependencyObject target, object value)
        {
            target.SetValue(EnterKeyCommandParamProperty, value);
        }

        public static readonly DependencyProperty EnterKeyCommandParamProperty =
            DependencyProperty.RegisterAttached(
                "EnterKeyCommandParam",
                typeof(object),
                typeof(EnterKeyHelpers),
                new PropertyMetadata(null));

        static void OnEnterKeyCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
        {
            ICommand command = (ICommand)e.NewValue;
            Control control = (Control)target;
            control.KeyDown += (s, args) =>
            {
                if (args.Key == Key.Enter)
                {
                    // make sure the textbox binding updates its source first
                    BindingExpression b = control.GetBindingExpression(TextBox.TextProperty);
                    if (b != null)
                    {
                        b.UpdateSource();
                    }
                    object commandParameter = GetEnterKeyCommandParam(target);
                    command.Execute(commandParameter);
                }
            };
        }
    } 

Verwendung:

<TextBox Text="{Binding Answer, Mode=TwoWay}" 
    my:EnterKeyHelpers.EnterKeyCommand="{Binding SubmitAnswerCommand}"
    my:EnterKeyHelpers.EnterKeyCommandParam="your parameter"/>

0 Stimmen

Command könnte hier beim Aufruf von " command.Execute(commandParameter);" null sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X