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