2009-05-07 5 views
0

Ich weiß, es gibt ein paar Debatten über diese Art von Sache. Auf jeden Fall habe ich mehrere Fälle, in denen ich ComboBox-Elemente basierend auf Enumerationen füllen müssen, die vom WCF-Dienst zurückgegeben werden.Silverlight Async-Aufrufe und anonyme Methoden

Um den Code sauber zu halten, habe ich diesen Ansatz gestartet. Nachdem ich mehr darüber gelesen habe, glaube ich nicht, dass das so gut funktioniert, wie man anfänglich denkt ...

Ich werfe dies heraus, um Empfehlungen/Ratschläge/Codeausschnitte zu bekommen, wie du das machen würdest oder wie du es derzeit machst Dies.

Ich kann gezwungen werden, eine separate, nicht anonyme Methode, Verfahren zu haben. Ich hasse es zu tun dies für so etwas, aber im Moment sehe nicht anders arbeiten ...

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

Grundsätzlich in diesem Beispiel wir ev verwenden, um die anonyme Methode zu halten, so können wir dann ev benutzen innerhalb der Methode, um es aus den einmal aufgerufenen Ereignissen zu entfernen. Dies verhindert, dass diese Methode mehr als einmal aufgerufen wird.

Ich vermute, dass die lokale ComboBox var vor diesem Aufruf deklariert, aber innerhalb der gleichen Methode, ist nicht immer die ComboBox ursprünglich vorgesehen, aber kann das noch nicht wirklich überprüfen. Ich kann ein Tag hinzufügen, um einige Tests durchzuführen und um zu verifizieren.

Sorry, wenn das nicht klar ist. Ich kann mehr, wenn nötig, ausarbeiten.

Danke.

+0

Was ist das Problem, das Sie haben? Werden Elemente nicht zur ComboBox hinzugefügt? – Andy

+0

Bitte erläutern. Es ist nicht klar, auf welches Problem Sie stoßen. Das Erweitern des Codebeispiels, um die gesamte Methode einzuschließen, kann ebenfalls hilfreich sein, damit wir sehen können, wo die Variable ComboBox deklariert und zugewiesen wird. –

+0

KISS. Halten Sie es einfach blöd. Sie müssen keine anonyme Methode verwenden, um ein Kombinationsfeld mit Daten zu füllen. Ein einfacher Delegat für den asynchronen Aufruf und ein für jede Schleife ist ausreichend. Als zusätzlicher Bonus wird es auch für den nächsten Programmierer völlig klar sein. – mattmanser

Antwort

1

Die Art und Weise kam ich, es zu tun, wie so ist:

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"; 

Ich schrieb ein blog post regarding some other problems and this.

Verwandte Themen