Pytanie Dodaj parametr do zdarzenia kliknięcia przycisku


Mam przycisk wpf w ten sposób:

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

I chcę przejść {Binding Code} przekazywana jako parametr do obsługi button1_click.
Jak mam to zrobić?

Zastrzeżenie: naprawdę nowe w WPF


44
2018-01-05 14:12


pochodzenie




Odpowiedzi:


Proste rozwiązanie:

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

W swoim treserze rzuć sender oponować Button i dostęp do Tag własność:

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

Bardziej eleganckim rozwiązaniem byłoby użycie Wzór polecenia WPF: Utwórz komendę dla funkcji, którą ma wykonać przycisk, powiązaj polecenie z przyciskami Command własność i powiązać CommandParameter do twojej wartości.


97
2018-01-05 14:18



Tag zrobi na razie i dla bardziej skomplikowanych scenariuszy zajrzę do wzorca poleceń. Dzięki - Boris Callens
+1 dla podpowiedzi na temat CommandParameter - Jim Counts
@Heinzi Dziękuję - Andrei


Nie jestem zbyt fanem "Tag", więc może

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

Następnie dostęp poprzez Atrybuty.

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

16
2017-09-28 09:44





Cóż, są na to dwa sposoby:

Przesyłaj DataContext

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

Lub użyj właściwości Tag, która jest ogólną właściwością stanu

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

następnie

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

8
2018-01-05 14:19



użyłbym (Button)sender zamiast sender as Button. W mało prawdopodobnym przypadku sender nie jest przyciskiem, (Button)sender rzuci wyjątek InvalidCastException, pomagając w ten sposób znaleźć błąd. Z drugiej strony Twój kod zostanie ustawiony w trybie cichym button do wartości null w tym przypadku, powodując później wyjątek NullReferenceException. - Heinzi


Korzystanie z Xaml i 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>

I MainPage Code Behing, ten przykład kodu służy do nawigacji na inną stronę z wykorzystaniem typu strony jako argumentu, musisz zrobić "YourPageTypeHere" i stronę odniesienia tutaj.

Następnie zaimplementuj kod 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; }
    }
}

Również w twojej klasie App potrzebujesz Instance of NavigationPage w MainPage do nawigacji (dla tego przykładu)

public App ()
        {
            InitializeComponent();

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

Jest to dla form xamarin, ale jest podobne dla projektów WPF.

Polecenie można zmienić za pomocą WPF i Xamarin: "https://stackoverflow.com/a/47887715/8210755"


0
2018-06-29 16:25