it-swarm.com.de

Parameter zum Button-Klickereignis hinzufügen

Ich habe einen Wpf-Button wie folgt:

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

Und ich möchte {Binding Code} als Parameter an den button1_click-Handler übergeben.
Wie gehe ich vor?

Disclaimer: wirklich neu bei WPF

45
Boris Callens

Einfache Lösung:

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

Umwandeln Sie in Ihrem Handler das sender-Objekt in Button und greifen Sie auf die Tag-Eigenschaft zu:

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

Eine elegantere Lösung wäre die Verwendung des Befehls Command von WPF : Erstellen Sie einen Befehl für die Funktion, die die Schaltfläche ausführen soll, binden Sie den Befehl an die Command -Eigenschaft der Schaltfläche und binden Sie die CommandParameter an Ihren Wert.

103
Heinzi

Ich bin also kein Fan von "Tag"

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

Dann über die Attribute zugreifen.

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

Nun, es gibt zwei Möglichkeiten, dies zu tun:

Konvertieren Sie den DataContext

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

Oder verwenden Sie die Tag-Eigenschaft, die eine generische State-Eigenschaft ist

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

dann

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

Verwendung von Xaml und 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>

Und MainPage Code Behing, in diesem Codebeispiel navigieren Sie mit dem Seitentyp als Argument zu einer anderen Seite. Hier müssen Sie "YourPageTypeHere" und eine Referenzseite erstellen.

Dann implementiere den Code Behind.

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

Auch in Ihrer App-Klasse benötigen Sie eine Instanz von NavigationPage in MainPage, um navigieren zu können (für dieses Beispiel).

public App ()
        {
            InitializeComponent();

            MainPage = new NavigationPage(new MainPage());
        }

Es ist für Xamarin-Formulare, aber für WPF-Projekte ist es ähnlich.

Der Befehl konnte für WPF und Xamarin geändert werden: " https://stackoverflow.com/a/47887715/8210755 "

0
Juan Pablo