2013-09-25 13 views
5

Ich habe ein Textfeld KeyUp Event Trigger Wired bis zu einem Befehl in WPF. Ich muss den eigentlichen Schlüssel übergeben, der als Befehlsparameter gedrückt wurde.Pass KeyUp als Parameter WPF Command Binding Textfeld

Der Befehl wird ordnungsgemäß ausgeführt, aber der Code, der ihn verarbeitet, muss den tatsächlich gedrückten Schlüssel kennen (denken Sie daran, dass es sich um eine Eingabetaste handeln könnte oder nicht nur um einen Buchstaben). Text).

Ich kann nicht herausfinden, wie das geht. XAML:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

XAML:

<TextBox Height="23" Name="TextBoxSelectionSearch" Width="148" Tag="Enter Selection Name" Text="{Binding Path=SelectionEditorFilter.SelectionNameFilter,UpdateSourceTrigger=PropertyChanged}" > 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="KeyUp"> 
      <i:InvokeCommandAction Command="{Binding SelectionEditorSelectionNameFilterKeyUpCommand}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
</TextBox> 
+0

Ich benutzte MVVMLight, und kann 'EventArgs' wie: http://Stackoverflow.com/a/6205643/352101 – Bolu

Antwort

7

Ich glaube nicht, dass das möglich ist mit InvokeCommandAction aber Sie können Ihre eigene Behavior schnell erstellen, die ungefähr so ​​aussehen könnte:

public class KeyUpWithArgsBehavior : Behavior<UIElement> 
{ 
    public ICommand KeyUpCommand 
    { 
     get { return (ICommand)GetValue(KeyUpCommandProperty); } 
     set { SetValue(KeyUpCommandProperty, value); } 
    } 

    public static readonly DependencyProperty KeyUpCommandProperty = 
     DependencyProperty.Register("KeyUpCommand", typeof(ICommand), typeof(KeyUpWithArgsBehavior), new UIPropertyMetadata(null)); 


    protected override void OnAttached() 
    { 
     AssociatedObject.KeyUp += new KeyEventHandler(AssociatedObjectKeyUp); 
     base.OnAttached(); 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.KeyUp -= new KeyEventHandler(AssociatedObjectKeyUp); 
     base.OnDetaching(); 
    } 

    private void AssociatedObjectKeyUp(object sender, KeyEventArgs e) 
    { 
     if (KeyUpCommand != null) 
     { 
      KeyUpCommand.Execute(e.Key); 
     } 
    } 
} 

und dann einfach an die TextBox:

anhängen
<TextBox Height="23" Name="TextBoxSelectionSearch" Width="148" Tag="Enter Selection Name" Text="{Binding Path=SelectionEditorFilter.SelectionNameFilter,UpdateSourceTrigger=PropertyChanged}" > 
    <i:Interaction.Behaviors> 
      <someNamespace:KeyUpWithArgsBehavior 
       KeyUpCommand="{Binding SelectionEditorSelectionNameFilterKeyUpCommand}" /> 
    </i:Interaction.Behaviors> 
</TextBox> 

Damit sollten Sie die Key als Parameter für den Befehl erhalten.

+0

Hey Entschuldigung, ich habe jetzt erkannt, ich möchte die vollständigen Ereignisargumente (nicht nur die Taste gedrückt) aber Ihre Antwort funktioniert für Tastendruck, irgendwelche Tipps, wie Sie volle Ereignisargumente erhalten können. – DermFrench

+0

Ich werde nur versuchen mit KeyUpCommand.Execute (e); – DermFrench

+0

Ja, das hat für mich funktioniert - vielen Dank (nur .Execute (e) anstelle von .Execute (e.key) gibt volle Ereignisargumente. Hervorragend! – DermFrench