Асинхронные вызовы Silverlight и анонимные методы - PullRequest
0 голосов
/ 07 мая 2009

Я знаю, что есть пара дебатов по этому поводу. Во всяком случае, у меня есть несколько случаев, когда мне нужно заполнять элементы ComboBox на основе перечислений, возвращаемых службой WCF.

Стремясь поддерживать чистоту кода, я начал этот подход. Изучив это больше, я не думаю, что это работает, как изначально думали ...

Я выкидываю это, чтобы получить рекомендации / советы / фрагменты кода о том, как вы это сделаете или как вы это делаете в настоящее время.

Возможно, меня заставят провести отдельную неанонимную процедуру. Я ненавижу делать это для чего-то подобного, но на данный момент не вижу, чтобы это работало по-другому ...

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

В основном в этом примере мы используем ev для хранения анонимного метода, чтобы затем мы могли использовать ev из метода, чтобы удалить его из событий, когда-то вызванных. Это предотвращает вызов этого метода более одного раза.

Я подозреваю, что локальная переменная ComboBox, объявленная перед этим вызовом, но в рамках одного и того же метода, не всегда изначально предназначена для ComboBox, но пока не может проверить это. Я могу добавить к нему тег, чтобы выполнить несколько тестов и заполнить его для проверки.

Извините, если это не ясно. Я могу уточнить, если нужно.

Спасибо.

1 Ответ

1 голос
/ 19 августа 2009

То, как я пришел к этому, выглядит так:

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

Я написал сообщение в блоге о некоторых других проблемах, и это .

...