2011-04-18 4 views
7

J'ai une liste de clients que j'utilise pour créer des éléments comme celui-ci:Monotouch.Dialog - Quel élément a été taraudés

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

Le problème est que lorsque l'élément est exploité, il envoie le dernier client à SomeController().

Comment puis-je définir le délégué taraudé avec des informations id le client?

Répondre

13

Vous devez garder le client en tant que variable locale dans la boucle:

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

Mais ce n'est pas une limitation MonoTouch.Dialog. Here's un article sur le problème général.

+0

L'explication était excellente, elle a maintenant un sens complet. –

+0

Cet article est fantastique. J'ai déjà rencontré et résolu ce problème par le passé, mais la dissection de Resnik est géniale. Décomposition de base: l'action que le lamda exécute est créée dès qu'elle est nécessaire à l'exécution ... à ce stade, l'itérateur dans l'instruction foreach a déjà été déplacé à la fin de la collection ... donc la dernière valeur dans la collection est ce qui sera utilisé dans l'action lamda. D'où la nécessité pour la variable locale d'injecter la valeur correcte dans le lambda. – NovaJoe

Questions connexes