为按钮单击事件添加参数

Posted

技术标签:

【中文标题】为按钮单击事件添加参数【英文标题】:Add parameter to Button click event 【发布时间】:2011-01-01 15:59:54 【问题描述】:

我有一个这样的 wpf 按钮:

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

我想将 Binding Code 作为参数传递给 button1_click 处理程序。 我该怎么办?

免责声明:对 WPF 来说真的很新

【问题讨论】:

【参考方案1】:

简单的解决方案:

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

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

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

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

【讨论】:

该标签现在可以使用,对于更复杂的场景,我将研究命令模式。谢谢【参考方案2】:

我不太喜欢“标签”,所以也许

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

【讨论】:

成员“myParam”无法识别或无法访问。【参考方案3】:

这有两种方法:

转换 DataContext

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

或者使用作为通用状态属性的 Tag 属性

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

【讨论】:

我会使用(Button)sender 而不是sender as Button。在sender 不是按钮的不太可能的情况下,(Button)sender 将抛出 InvalidCastException,从而帮助您找到错误。另一方面,在这种情况下,您的代码会默默地将 button 设置为 null,稍后会导致 NullReferenceException。【参考方案4】:

使用 Xaml 和 DataContext

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataAndCloudServices"
             x:Class="DataAndCloudServices.MainPage" >

    <StackLayout>
        <!-- Command Implemented In Code Behing -->
        <Button Text="Consuming Web Services Samples" 
                Command="Binding NavigateCommand" 
                CommandParameter="x:Type local:YourPageTypeHere" >

        </Button>
    </StackLayout>
</ContentPage>

还有MainPage Code Behing,此代码示例是使用页面类型作为参数导航到另一个页面,您需要在此处设置“YourPageTypeHere”和引用页面。

然后在后面实现代码。

using System;
using System.Windows.Input;
using Xamarin.Forms;

namespace DataAndCloudServices

    public partial class MainPage : ContentPage
    
        public MainPage()
        
            InitializeComponent();

            NavigateCommand = new Command<Type>(
              async (Type pageType) =>
              
                  Page page = (Page)Activator.CreateInstance(pageType);
                  await Navigation.PushAsync(page);
              );

            this.BindingContext = this;
        
        public ICommand NavigateCommand  private set; get; 
    

在您的 App 类中还需要 MainPage 中的 NavigationPage 实例来导航(对于此示例)

public App ()

    InitializeComponent();

    MainPage = new NavigationPage(new MainPage());

适用于 xamarin 表单,但适用于 WPF 项目。

可以使用 WPF 和 Xamarin 更改命令:“https://***.com/a/47887715/8210755”

【讨论】:

以上是关于为按钮单击事件添加参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Expression Blend 中的单个事件处理程序中为按钮单击添加多个事件?

如何实现按钮单击事件 C#

通过单击按钮向 ComboBox 添加值

js如何给按钮添加点击事件

◆◆1OO ALV-单击事件,双击事件,添加自定义按钮事件(EVENT)实例

如何在 Swift 中的 UITableViewCell 上添加带有单击事件的按钮?