#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 в качестве параметра вы можете настроить класс для обработки входных параметров. Затем внешняя сторона может использовать однострочную инициализацию объекта и использовать для передачи.