2010-01-05 48 views
42

我有這樣一個WPF按鈕:參數添加到按鈕單擊事件

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

而且我想通過{Binding Code}作爲參數到Button處理程序通過。
我該如何解決這個問題?

免責聲明:真正的新WPF

回答

90

簡單的解決方案:

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

在你的處理器,施放sender對象Button並訪問Tag屬性:

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

更優雅的解決方案是使用Command pattern of WPF:爲您希望按鈕執行的功能創建命令,將命令綁定到按鈕的Command屬性並將CommandParameter綁定到您的值。

+1

該標籤將爲現在和更復雜的情況,我會看看命令模式。謝謝 – 2010-01-05 14:29:55

+3

+1關於'CommandParameter'的提示 – 2012-10-04 22:06:52

+0

@ Heinzi謝謝 – Andrei 2014-07-31 11:27:41

6

那麼有這樣做的方法有兩種:

演員在DataContext

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

,或是使用標記屬性,它是一個通用的國家財產

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

然後

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

我會使用'(Button)sender'而不是'sender作爲Button'。在不太可能的情況下,'sender'不是一個按鈕,'(Button)sender'會拋出一個InvalidCastException,從而幫助您找到錯誤。另一方面,你的代碼在這種情況下會默默設置'button'爲null,以後會引發NullReferenceException異常。 – Heinzi 2011-01-06 21:36:50

14

我並不過分喜歡'Tag',所以也許

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

然後通過屬性進行訪問。

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