Привязка команды Xamarin к 2 методам аргументов

#c# #xamarin #delegates #commandbinding

#c# #xamarin #делегаты #привязка команд

Вопрос:

Я новичок и недостаточно знаком с делегатами и лямбда-операторами. Так что это может быть слишком просто, но вот моя проблема:

Я пытаюсь реализовать метод асинхронной подписки с 2 аргументами, используя привязку команд в Xamarin. Когда я написал команду инициализации, показанную ниже, редактор кода говорит

Действие не принимает два аргумента

Итак, что я должен сделать, чтобы использовать два метода асинхронной передачи аргументов для привязки команд?

 //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)
{...}
  

Ответ №1:

Вы можете передать объект модели в качестве параметра, и он может содержать более одного аргумента.

Например:

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

CheckItem.cs:

 public class CheckItem 
{

    public string productId { set; get; }

    public string payload { set; get; }

}
  

Ответ №2:

Проверьте Command определение здесь

Команда (действие) инициализирует новый экземпляр класса Command.

Action Класс не принимает никаких входных аргументов:

 public delegate void Action();
  

Таким образом, вы можете создать его только с помощью метода, который не принимает параметров и ничего не возвращает

Комментарии:

1. согласен. Но мне нужно два аргумента для передачи в метод. Должен быть способ.

Ответ №3:

Я нашел способ выполнить это, передав объект, содержащий все необходимые параметры. На самом деле, @Junior Jiang предложил это. Но я также хотел закодировать его в однострочной лямбда-нотации.

Вот мое решение.

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

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

Комментарии:

1. Отлично! Не забудьте отметить ответ, когда сможете. При использовании object в качестве параметра вы можете настроить класс для обработки входных параметров. Затем внешняя сторона может использовать однострочную инициализацию объекта и использовать для передачи.