web-dev-qa-db-fra.com

Comment passer le bouton en tant que CommandParameter de XAML dans une page Xamarin.Forms?

Je voudrais passer un Xamarin.Forms.Button dans sa propre Command en tant que CommandParameter à mon ViewModel. Je sais comment y parvenir à partir du code derrière, par exemple. ...

XAML (la plupart des propriétés sont manquantes pour des raisons de concision)

<Button x:Name="myButton"
    Text="My Button"
    Command="{Binding ButtonClickCommand}"/>

XAML.cs

public partial class MyTestPage
{
    public MyTestPage()
    {
        InitializeComponent();

        myButton.CommandParameter = myButton;
    }
}

ViewModel

public class MyViewModel : ViewModelBase
{
    public MyViewModel()
    {
        ButtonClickCommand = new Command(
            (parameter) =>
            {
                var view = parameter as Xamarin.Forms.Button;
                if (view != null)
                {
                    // Do Stuff
                }
            });
    }

    public ICommand ButtonClickCommand { get; private set; }
}

... MAIS est-il possible de déclarer la CommandParameter dans le XAML lui-même? Ou en d'autres termes, quelle est la syntaxe de liaison pour définir le paramètre sur le bouton lui-même?

<Button x:Name="myButton"
        Text="My Button"
        Command="{Binding ButtonClickCommand}"
        CommandParameter="{[WHAT WOULD GO HERE]}"/>

d'ailleurs j'ai déjà essayé CommandParameter="{Binding RelativeSource={RelativeSource Self}}" et cela n'a pas fonctionné.

Merci,

11
Gavin Sutherland

Xamarin.Forms a une extension de marquage de référence qui fait exactement cela:

<Button x:Name="myButton"
    Text="My Button"
    Command="{Binding ButtonClickCommand}"
    CommandParameter="{x:Reference myButton}"/>

Bien que ce soit la première fois que je constate ce besoin, vous pouvez probablement mieux séparer vos vues de vos modèles de vue et résoudre ce problème en utilisant un modèle plus propre ou en pas en partageant une commande entre plusieurs boutons.

19
Stephane Delcroix
 <Button x:Name="myButton"
        Text="My Button"
        Command="{Binding ButtonClickCommand}"
        CommandParameter="{x:Reference myButton}"/>

Dans votre ViewModel

public YourViewModel()
{
    ButtonClickCommand= new Command(ButtonClicked);
}

private async void ButtonClicked(object sender)
{
    var view = sender as Xamarin.Forms.Button;
}