2010-08-19 14 views
21

ich eine Taste erhöhen:Programmatically einen Befehl

<Button x:Name="MyButton" Command="SomeCommand"/> 

Gibt es eine Möglichkeit, den Befehl von der Quelle ausführen? Der Aufruf der Klick auf den Button nicht hilft:

MyButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 

Ich meine - das ist das Ereignis tut erhöhen, aber es wirft nicht den Befehl. Gibt es etwas ähnliches zu diesem RaiseEvent aber nur für Command? Wenn nicht - wie kann ich ExecutedRoutedEventArgs instanziieren? Ist es möglich?

Schließlich - bitte sagen Sie mir nicht, wie man avoid Aufruf des Befehls.

Antwort

42

Nicht sicher, ob Sie nach:

if(MyButton.Command != null){ 
    MyButton.Command.Execute(null); 
} 

mit C# 6 und später (wie von eirik vorgeschlagen) gibt es die Kurzform:

Mybutton.Command?.Execute(null); 
+1

Danke. Das ist so einfach, aber ich habe es nicht geschafft, daran zu denken! – Jefim

+0

Das sieht so komisch aus. Sollte es nicht "if (MyButton.Command! = Null)" sein? –

+0

Alte Gewohnheiten, fühlen sich frei zu ändern. Verhalten ist das gleiche ... – HCL

7

Sie benötigen ICommand.Execute(object), um dies zu erreichen.

Arbeitsbeispiel für Ihren Beispielcode: this.MyButton.Command.Execute(null);

9

Oder wenn Sie keinen Zugriff auf das UI-Element haben, können Sie den statischen Befehl direkt aufrufen. Zum Beispiel habe ich eine systemweite Schlüsselhaken in App.xaml und wollte meine Play/Pause rufen/etc Medienereignisse stoppen:

CustomCommands.PlaybackPlayPause.Execute(null, null); 

2. Parameter als null geben werden alle angeschlossenen Elemente nennen.

5

Mein bevorzugter Weg, es zu tun ist, zu tun, wie Sean Sexton in Executing a Command Programmatically

Kurz empfehlen, den Befehl finden, zu überprüfen, ob es ausführen kann, und wenn ja, ausführen.

Beispiel:

if (ApplicationCommands.Open.CanExecute(null, null)) 
     ApplicationCommands.Open.Execute(null, null); 

Warum ich denke, es ist besser: Ich denke, es ist der beste Weg ist, weil es wirklich den richtigen Pfad verwenden und was Sie tun, hängt keine Kontrolle über die Benennung. Auch wenn Sie jetzt wissen, dass Sie nicht "CanExecute" verwenden, wissen Sie nie, wann jemand in der Zukunft ein Verhalten dafür hinzufügen wird.

Verwandte Themen