2010-06-17 21 views
8

Tengo una aplicación WPF Microsoft Surface y estoy usando MVVM-Pattern.WPF: Enlace a comandos en el código detrás de

tengo algunos botones que se crean en el código detrás y me gustaría enlazar comandos para ellos, pero yo sólo sé cómo funciona en el XAML

así:

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

Pero no puedo hacerlo así porque mis botones no existen en el XAML, solo en el código detrás.

Entonces, ¿cómo funcionaría un comando de enlace como ese en código?

Respuesta

15

Asumiendo que usted tiene una llamada a su SurfaceButton a "SurfaceButton1" y tiene acceso a una instancia del comando, puede utilizar el siguiente código:

SurfaceButton1.Command = SaveReservationCommand; 
+1

+1 para la respuesta correcta. Además, si es necesario, puede usar Binding en el código (http://msdn.microsoft.com/en-us/magazine/cc700358.aspx#id0190003) – Anvaka

+2

Gracias por la respuesta rápida. No pensé que sería TAN fácil;) – sofri

+0

El enlace podría establecerse en el código subyacente, pero la implementación NO debería ser y este código solo funcionaría si lo fuera. – David

3

Tomé el código del enlace publicado por Anvaka como plantilla. Yo uso RadMenuItem de Telerik, pero seguramente puedes usar cualquier otro componente que exponga la propiedad 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); 

creo que sirve ... y si algo no está claro, lo siento, es mi primer post :)

12

La respuesta aceptada será un gran trabajo si el botón tiene acceso al sistema. Sin embargo, en MVVM estos generalmente se mantienen separados (el Botón en la Vista y el Comando en el Modelo de Vista). En XAML normalmente usaría un enlace de datos para conectarlo (como el ejemplo en la pregunta).

Mi programa me dio un error cuando mi Botón dinámico no pudo encontrar el Comando (porque estaba en un espacio de nombres totalmente diferente). Así es como terminé resolviendo esto:

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