2010-06-17 1 views
8

Ich habe eine WPF Microsoft Surface Application und ich verwende MVVM-Pattern.WPF: Bindung an Befehle in Code hinter

Ich habe einige Tasten, die hinter im Code erstellt werden, und ich möchte Befehle an sie binden, aber ich weiß nur, wie die in der XAML arbeitet

wie folgt aus:

<Custom:SurfaceButton Command="{Binding SaveReservationCommandBinding, Mode=OneWay}"/> 

Aber ich kann es nicht so machen, weil meine Buttons nicht im XAML existieren, nur im Code dahinter.

Also, wie würde ein Befehl, der so funktioniert, im Code funktionieren?

Antwort

15

Unter der Annahme, dass Sie einen Namen Ihrer SurfaceButton müssen „SurfaceButton1“ und Sie haben Zugriff auf eine Instanz des Befehls können Sie den folgenden Code verwenden:

SurfaceButton1.Command = SaveReservationCommand; 
+1

+1 für die richtige Antwort. Auch bei Bedarf kann man Binding im Code verwenden (http://msdn.microsoft.com/en-us/magazine/cc700358.aspx#id0190003) – Anvaka

+2

Vielen Dank für die schnelle Antwort. Dachte nicht, dass es so einfach wäre;) – sofri

+0

Die Bindung könnte im Code hinter sein, aber die Implementierung sollte nicht sein und dieser Code würde nur funktionieren, wenn es war. – David

3

nahm ich den Code aus dem Link gepostet von Anvaka als Vorlage. Ich verwende RadMenuItem von Telerik, aber Sie können sicherlich jede andere Komponente verwenden, die die Command-Eigenschaft zur Verfügung stellt.

item = new RadMenuItem(); 
item.Header = "Hide Column"; 
DependencyProperty commProp = RadMenuItem.CommandProperty; 
if (!BindingOperations.IsDataBound(item, commProp)) { 
    Binding binding = new Binding("HideColumnCommand"); 
    BindingOperations.SetBinding(item, commProp, binding); 
} 
//this is optional, i found easier to pass the direct ref of the parameter instead of another binding (it would be a binding to ElementName). 
item.CommandParameter = headerlCell.Column; 
menu.Items.Add(item); 

Hoffe, es hilft ... und wenn etwas nicht klar ist, sorry, es ist mein erster Beitrag :)

12

Die akzeptierte Antwort große Arbeit, wenn der Knopf Zugriff auf den Befehl hat. In MVVM werden diese normalerweise getrennt gehalten (der Button in der Ansicht und der Befehl im View-Modell). In XAML verwenden Sie normalerweise eine Datenbindung, um es zu verbinden (wie das Beispiel in der Frage).

Mein Programm gab mir einen Fehler, wenn mein dynamischer Button den Befehl nicht finden konnte (weil er in einem völlig anderen Namensraum war). So habe ich das gelöst:

SurfaceButton.SetBinding (Button.CommandProperty, new Binding("SaveReservationCommand"));