Передача аргументов в метод ExecuteQueryAsync. - PullRequest
2 голосов
/ 29 июля 2011

У меня есть приложение Silverlight, в котором есть несколько полей со списком, которые я хочу заполнить именами полей из списка SharePoint. Каждый ComboBox может иметь разные поля из этого списка, например, ComboBoxA содержит поля пользователя и числовые поля ComboBoxB. Теперь я не хочу создавать разные ClientRequestSucceededEventHandler и ClientRequestFailedEventHandler для каждого ComboBox. Я тоже не хочу "симулировать" асинхронную обработку.

Моя идея состояла в том, чтобы передать некоторый параметр этим обработчикам событий (например, ссылку на целевое поле со списком и коллекцию элементов):

    void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        Context = ClientContext.Current;

        //load query for getting user fields

        Context.ExecuteQueryAsync(fieldsCallback_Succeeded(cbUserFields, userFields), fieldCallback_Failed);

        //load query for getting number fields

        Context.ExecuteQueryAsync(fieldsCallback_Succeeded(cbUserFields, numberFields), fieldCallback_Failed);
    }

    void fieldsCallback_Succeeded(object sender, ClientRequestSucceededEventArgs e)
    {
        FieldsQueryParams queryParams = sender as FieldsQueryParams;
        this.Dispatcher.BeginInvoke(() => queryParams.cbToFill = queryParams.Fields);
    }

OR

    void fieldsCallback_Succeeded(object sender, ClientRequestSucceededEventArgs e, ComboBox cbToFill, IEnumerable<Field> fields)
    {
        this.Dispatcher.BeginInvoke(() => cbToFill.ItemsSource = fields);
    }

Таким образом, вопрос заключается в следующем: как передать некоторый параметр этим обработчикам событий (например, ссылку на элемент управления назначения). Или как решить эту проблему другим способом?

1 Ответ

1 голос
/ 19 октября 2011

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

Ожидается увидеть:

public virtual void ExecuteQueryAsync(
    ClientRequestSucceededEventHandler succeededCallback,
    ClientRequestFailedEventHandler failedCallback
)
...