2009-05-07 5 views
0

Je sais qu'il ya quelques débats sur ce genre de chose. En tout cas, j'ai plusieurs cas où j'ai besoin de remplir les éléments ComboBox en fonction des énumérations retournées par le service WCF. Dans le but de garder le code propre, j'ai commencé cette approche. Après avoir examiné la question plus en profondeur, je ne pense pas que cela fonctionne aussi bien ...Silverlight appels asynchrones et des méthodes anonymes

Je jette ça pour obtenir des recommandations/conseils/extraits de code sur la façon dont vous le feriez ou comment vous le faites actuellement ce.

Je peux être forcé d'avoir une procédure séparée, non anonyme. Je déteste faire cela pour quelque chose comme ça, mais pour le moment, ne voient pas travailler d'une autre manière ...

EventHandler<GetEnumerationsForTypeCompletedEventArgs> ev = delegate(object eventSender, GetEnumerationsForTypeCompletedEventArgs eventArgs) 
{ 
    if (eventArgs.Error == null) 
    { 
     //comboBox.ItemsSource = eventArgs.Result; 
     //populate combox for display purposes (for now) 
     foreach (Enumeration e in eventArgs.Result) 
     { 
      ComboBoxItem cbi = new ComboBoxItem(); 
      cbi.Content = e.EnumerationValueDisplayed; 
      comboBox.Items.Add(cbi); 
     } 
     // remove event so we don't keep adding new events each time we need an enumeration 
     proxy.GetEnumerationsForTypeCompleted -= ev; 
    } 
}; 
proxy.GetEnumerationsForTypeCompleted += ev; 
proxy.GetEnumerationsForTypeAsync(sEnumerationType); 

En gros, dans cet exemple, nous utilisons ev pour maintenir la méthode anonyme afin que nous puissions ensuite utiliser ev de dans la méthode pour l'enlever des événements une fois appelés. Cela empêche cette méthode d'être appelée plus d'une fois.

Je soupçonne que la variable locale ComboBox déclarée avant cet appel, mais dans la même méthode, n'est pas toujours la ComboBox prévue à l'origine, mais ne peut pas vraiment vérifier cela pour le moment. Je peux y ajouter une balise pour faire quelques tests et remplir pour vérifier.

Désolé, ce n'est pas clair. Je peux élaborer plus si nécessaire.

Merci.

+0

Quel est le problème que vous rencontrez? Les éléments ne sont-ils pas ajoutés au ComboBox? – Andy

+0

Veuillez élaborer. On ne sait pas quel problème vous rencontrez. L'expansion de l'exemple de code pour inclure la méthode entière peut également être utile afin que nous puissions voir où la variable comboBox est déclarée et affectée. –

+0

KISS. Gardez-le simple stupide. Vous n'avez pas besoin d'utiliser une méthode anonyme pour remplir une zone de liste déroulante avec des données. Un délégué simple sur l'appel asynchrone et un pour chaque boucle est suffisant. En prime, il sera également complètement clair pour le programmeur suivant. – mattmanser

Répondre

1

La façon dont je suis venu à le faire est comme ceci:

var query = from t in GetFreshContext().Employee select t; 
var dsQuery = (DataServiceQuery<Employee>)query; 
dsQuery.BeginExecute(result => 
{ 
    ComboEmployees.ItemsSource = dsQuery.EndExecute(result).ToArray(); 
}, null); 
ComboEmployees.DisplayMemberPath = "FullName"; 

J'ai écrit un blog post regarding some other problems and this.

Questions connexes