2011-04-18 12 views
7

que tiene una lista de clientes que utilizo para crear Elementos como este:Monotouch.Dialog - ¿Qué elemento fue aprovechado

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

El problema es que cuando se ha tocado el elemento que envía el último cliente a SomeController().

¿Cómo puedo configurar el Delegado Tapped con información que id al cliente?

Respuesta

13

que necesita para mantener al cliente como variable local en el bucle:

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)); }; 
} 

Pero esto no es una limitación con MonoTouch.Dialog. Here's un artículo sobre el problema general.

+0

La explicación fue excelente, ahora tiene mucho sentido. –

+0

Ese artículo es fantástico. He encontrado y resuelto este problema por mi cuenta en el pasado, pero la disección de Resnik es increíble. Desglose básico: la acción que realiza el lamda se crea tan pronto como se necesita en tiempo de ejecución ... en ese punto, el iterador en la instrucción foreach ya se ha movido al final de la colección ... por lo que el último valor en la colección es lo que se usará en la acción lamda. Por lo tanto, la necesidad de la variable local para inyectar el valor adecuado en el lambda. – NovaJoe

Cuestiones relacionadas