web-dev-qa-db-ja.com

ボタンクリックイベントにパラメーターを追加

このようなwpfボタンがあります。

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

そして、{Binding Code}は、button1_clickハンドラーにパラメーターとして渡されます。
これについてどうすればいいですか?

免責事項:WPFの新機能

50
Boris Callens

簡単なソリューション:

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

ハンドラーで、senderオブジェクトをButtonにキャストし、Tagプロパティにアクセスします。

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

よりエレガントな解決策は、 WPFのコマンドパターン を使用することです。ボタンに実行する機能のコマンドを作成し、コマンドをボタンのCommandプロパティにバインドし、 CommandParameterをあなたの値に。

113
Heinzi

私は過度に「タグ」のファンではないので、おそらく

<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()
 }
16
TheMonkeyMan

これを行うには2つの方法があります。

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;
}
10
bendewey

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://stackoverflow.com/a/47887715/8210755 "

0
Juan Pablo