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
Тази статия е фантастична. Сблъсквал съм се и съм разрешавал този проблем сам в миналото, но дисекцията на Resnik е страхотна. Основна разбивка: действието, което lamda изпълнява, се създава веднага щом е необходимо по време на изпълнение...в този момент итераторът в оператора foreach вече е преместен в края на колекцията...така че последната стойност в колекцията е това, което ще се използва в действието lamda. Следователно, необходимостта локалната променлива да инжектира правилната стойност в ламбда. - person NovaJoe; 01.06.2011