Monotouch.Dialog — Какой элемент был нажат

У меня есть список клиентов, которые я использую для создания таких элементов:

Foreach(Customer c in Customers)
{
    //Make the StyledStringElement
    //Set the Tapped to action a touch
    element.Tapped += () => {  Push (new SomeController (c.ClientId)); };
}

Проблема в том, что при касании элемента он отправляет последнего клиента в SomeController().

Как я могу установить для Tapped Delegate информацию, которая будет идентифицировать клиента?


person Ian Vink    schedule 18.04.2011    source источник


Ответы (1)


Вам нужно сохранить клиента как локальную переменную в цикле:

foreach(Customer c in Customers)
{    
    //Make the StyledStringElement
    //Set the Tapped to action a touch
    var currentCustomer = c;
    element.Tapped += () => {  Push (new SomeController (currentCustomer.ClientId)); };
}

Но это не ограничение MonoTouch.Dialog. Вот статья об общей проблеме.

person Waescher    schedule 18.04.2011
comment
Эта статья фантастическая. В прошлом я сталкивался с этой проблемой и решал ее самостоятельно, но анализ Резника потрясающий. Основная разбивка: действие, которое выполняет лямбда, создается, как только оно необходимо во время выполнения... в этот момент итератор в операторе foreach уже перемещен в конец коллекции... поэтому последнее значение в коллекции это то, что будет использоваться в лямбда-действии. Следовательно, необходимо, чтобы локальная переменная вводила правильное значение в лямбду. - person NovaJoe; 01.06.2011