将参数添加到按钮单击事件

Bor*_*ens 51 c# wpf click button .net-3.5

我有一个像这样的wpf按钮:

<Button Click="button1_Click" Height="23" Margin="0,0,5,0" Name="button1" Width="75">Initiate</Button>
Run Code Online (Sandbox Code Playgroud)

我想将pass {Binding Code}作为参数传递给button1_click处理程序.
我该怎么做?

免责声明:WPF真的很新

Hei*_*nzi 116

简单方案:

<Button Tag="{Binding Code}" ...>
Run Code Online (Sandbox Code Playgroud)

在您的处理程序中,将sender对象强制转换Button并访问该Tag属性:

var myValue = ((Button)sender).Tag;
Run Code Online (Sandbox Code Playgroud)

更优雅的解决方案是使用WPF命令模式:为希望按钮执行的功能创建命令,将Command绑定到Button的Command属性并绑定CommandParameter到您的值.

  • 该标签暂时可以使用,对于更复杂的场景,我将研究命令模式。谢谢 (2认同)

The*_*Man 16

我也许并不是'Tag'的粉丝

<Button Click="button1_Click" myParam="parameter1" Height="23" Margin="0,0,5,0" Name="button1" Width="75">Initiate</Button>
Run Code Online (Sandbox Code Playgroud)

然后通过属性访问.

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

  • 成员“myParam”无法识别或无法访问。 (9认同)

ben*_*wey 10

那么有两种方法可以做到这一点:

转换DataContext

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

或者使用Tag属性,它是一个通用的属性

 <Button Click="button1_Click" Height="23" Margin="0,0,5,0" Name="button1" Tag="{Binding Code}" />
Run Code Online (Sandbox Code Playgroud)

然后

void button1_Click(object sender, RoutedEventArgs e)
{
    var button = sender as Button;
    var code = button.Tag;
}
Run Code Online (Sandbox Code Playgroud)

  • 我会使用`(Button)sender`而不是`sender as Button`.在不太可能的情况下,`sender`不是按钮,`(Button)sender`将抛出InvalidCastException,从而帮助您找到错误.另一方面,你的代码将在这种情况下静默地将`button`设置为null,稍后会导致NullReferenceException. (9认同)