2010-01-05 17 views
42

tengo un botón WPF como esto:Añadir parámetro para evento de clic del botón

<Button Click="button1_Click" Height="23" Margin="0,0,5,0" Name="button1" Width="75">Initiate</Button> 

Y quiero pasar {Binding Code} pasado como parámetro al controlador Button1_Click.
¿Cómo hago esto?

responsabilidad: realmente nuevo a WPF

Respuesta

90

solución simple:

<Button Tag="{Binding Code}" ...> 

En su controlador, convertir el objeto sender a Button y accede a la Tag propiedad:

var myValue = ((Button)sender).Tag; 

Una solución más elegante sería usar el Command pattern of WPF: cree un comando para la funcionalidad que desea que el botón realice, vincule el comando a la propiedad del botón Command y vincule el CommandParameter a su valor.

+1

La etiqueta lo hará por ahora y para escenarios más complicados, examinaré el patrón de comando. Gracias –

+3

+1 por la pista sobre 'CommandParameter' –

+0

@Heinzi Gracias – Andrei

6

Bueno, hay dos maneras de hacer esto:

moldeada DataContext

void button1_Click(object sender, RoutedEventArgs e) 
{ 
    var button = sender as Button; 
    var code = ((Coupon)button.DataContext).Code; 
} 

o utilizar la propiedad Tag que es una propiedad del estado genérico

<Button Click="button1_Click" Height="23" Margin="0,0,5,0" Name="button1" Tag="{Binding Code}" /> 

continuación

void button1_Click(object sender, RoutedEventArgs e) 
{ 
    var button = sender as Button; 
    var code = button.Tag; 
} 
+8

Yo usaría' remitente de Button 'en lugar de 'sender como Button'. En el caso improbable de que 'sender' no sea un botón,' (Button) sender' arrojará una InvalidCastException, lo que le ayudará a encontrar el error. Su código, por otro lado, silenciosamente configurará 'button' para anular en ese caso, causando una NullReferenceException más adelante. – Heinzi

14

No soy demasiado fan de 'etiqueta' así que quizás

<Button Click="button1_Click" myParam="parameter1" Height="23" Margin="0,0,5,0" Name="button1" Width="75">Initiate</Button> 

Luego acceso a través de los atributos.

void button1_Click(object sender, RoutedEventArgs e) 
{ 
    var button = sender as Button; 
    var theValue = button.Attributes["myParam"].ToString() 
} 
Cuestiones relacionadas