2010-06-17 10 views
8

J'ai une application Microsoft Surface WPF et j'utilise MVVM-Pattern.WPF: liaison aux commandes dans le code derrière

J'ai quelques boutons qui sont créés dans le code derrière et je voudrais lier des commandes à eux, mais je ne sais comment cela fonctionne dans le XAML

comme ceci:

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

Mais je ne peut pas faire comme ça parce que mes boutons n'existent pas dans le XAML, seulement dans le code derrière.

Alors, comment une commande de liaison comme celle-ci fonctionne-t-elle dans le code?

Répondre

15

En supposant que vous avez un nom de votre SurfaceButton à « SurfaceButton1 » et vous avez accès à une instance de la commande, vous pouvez utiliser le code suivant:

SurfaceButton1.Command = SaveReservationCommand; 
+1

+1 pour la réponse correcte. Aussi, si nécessaire, on peut utiliser la liaison dans le code (http://msdn.microsoft.com/en-us/magazine/cc700358.aspx#id0190003) – Anvaka

+2

Merci pour la réponse rapide. Je ne pensais pas que ce serait si facile;) – sofri

+0

La liaison pourrait être définie dans le code derrière mais l'implémentation ne devrait pas être et ce code ne fonctionnerait que si c'était le cas. – David

3

Je pris le code du lien affiché par Anvaka comme modèle. J'utilise RadMenuItem de Telerik, mais vous pouvez sûrement utiliser n'importe quel autre composant qui expose la propriété Command.

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); 

... Hope it helps et si quelque chose n'est pas clair, désolé, c'est mon premier post :)

12

La réponse acceptée fonctionnera bien si le bouton a accès à la commande. Cependant, dans MVVM, ils sont généralement séparés (le bouton dans la vue et la commande dans le modèle de vue). En XAML vous utiliseriez normalement une liaison de données pour l'accrocher (comme l'exemple dans la question).

Mon programme m'a donné une erreur quand mon bouton dynamique n'a pas pu trouver la commande (parce qu'il était dans un espace de noms totalement différent). Voici comment j'ai résolu ceci:

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