0
votes

Liaison de commande Xamarin à 2 méthodes d'argument

Je suis novice et je ne connais pas assez bien les délégués et les déclarations lambda. Donc, c'est peut-être trop simple, mais voici mon problème:

J'essaie d'implémenter la méthode d'abonnement async avec 2 arguments en utilisant la liaison de commande dans Xamarin. Lorsque j'ai écrit la commande d'initialisation ci-dessous, l'éditeur de code dit

L'action ne prend pas deux arguments

Alors, que dois-je faire pour utiliser deux méthodes asynchrones d'argument pour la liaison de commande?

//Command initializing line cause an error which says " Action<object> does not take two arguments. 
Subscribe = new Command(async (productId,payload) => await SubscribeAsync(productId,payload));
....
public async Task<bool> SubscribeAsync(string productId, string payload)
{...}


0 commentaires

3 Réponses :


0
votes

Vérifiez la définition de la Command ici

Command (Action) Initialise une nouvelle instance de la classe Command.

La classe Action ne prend aucun argument d'entrée :

public delegate void Action();

Vous ne pouvez donc l'instancier qu'avec une méthode qui ne prend aucun paramètre et ne renvoie rien


1 commentaires

se mettre d'accord. Mais j'ai besoin de deux arguments pour passer en méthode. Il devrait y avoir un moyen.



1
votes

Vous pouvez passer un objet de modèle en tant que paramètre, et il peut contenir plusieurs arguments.

Par exemple:

public class CheckItem 
{

    public string productId { set; get; }

    public string payload { set; get; }

}

CheckItem.cs :

ICommand SubscribeCommand = new Command((parmaters) => {
    var item = (parmaters as CheckItem);
    var one = item.productId;
    var two = item.payload;
});


0 commentaires

0
votes

J'ai trouvé un moyen de l'accomplir en passant un objet contenant tous les paramètres nécessaires. En fait, @Junior Jiang l'a suggéré. Mais je cherchais aussi à le coder en notation lambda sur une ligne.

Voici ma solution.

        public SubscriptionViewModel()
        {
        subscriptionInfo = new SubscriptionInfo("s01", "payload");

        Subscribe = new Command<SubscriptionInfo>(async (s) => await GetSubscritionsOptsAsync(this.subscriptionInfo));
    ...
    }


1 commentaires

Génial! N'oubliez pas de marquer la réponse lorsque vous le pouvez. Si vous utilisez un objet comme paramètre, vous pouvez personnaliser une classe pour gérer les paramètres d'entrée. Ensuite, l'extérieur peut utiliser une ligne pour initier l'objet et l'utiliser pour passer.