Службы RIA: загрузка не возвращает данных

В примере приложения BookClub от nikhilk Kothary поле со списком используется для отображения категорий книг.

Вот так в классе модели представления (приложение использует паттерн MVVM):

частный ReferenceDataContext _referenceData;

public BookClubModel() { // Конструктор _referenceData = new ReferenceDataContext();

_referenceData.Load(_referenceData.GetcategoriesQuery(), false);

}

Затем есть свойство, к которому привязано поле со списком:

общедоступные категории IEnumerable {получить {возврат _referenceData.Categories; } }

Почему это работает? Разве у нас не должен быть «завершенный» обработчик событий для операции загрузки?

Если я хочу заполнить свойство IEnumerable в конструкторе, то оно не работает:

частный ReferenceDataContext _referenceData;

частные IEnumerable _categories;

public BookClubModel() { // Конструктор _referenceData = new ReferenceDataContext();

_referenceData.Load(_referenceData.GetcategoriesQuery(), false);

_categories = _referenceData.Categories; _referenceData.Categories was what we were returning in the Categories property above.

}

Почему в одном случае работает, а в другом нет?

Даниэль


person Daniel    schedule 18.02.2011    source источник


Ответы (1)


В первом случае Categories является ссылкой на _referenceData.Categories. А когда обновилась _referenceData.Categories коллекция, Categories тоже обновилась.

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

Внутренне, когда вы вызываете Load, выполняется запрос к базе данных, и когда результат извлекается, вызывается обратный вызов операции загрузки. Операция загрузки является асинхронной операцией, и вы должны помнить об этом факте.

person Sergey Vedernikov    schedule 18.02.2011
comment
Но как это работает внутри? _referenceData.Categories получает список категорий из контекста, и как только он загружается, свойство обновляется? Означает ли это, что нам не нужно всегда выполнять асинхронную загрузку? - person Daniel; 18.02.2011
comment
внутренне, когда вы вызываете Load, выполняется запрос к базе данных, и когда результат извлекается, вызывается обратный вызов операции загрузки. операция загрузки является асинхронной операцией, и вам нужно помнить об этом факте - person Sergey Vedernikov; 18.02.2011
comment
Ок :-) Теперь понял ;-) Большое спасибо ultor! - person Daniel; 18.02.2011
comment
Хотя другой вопрос. Операцию загрузки с делегатом я понимаю, но в случае свойства Categories, как это работает? Сначала я загружаю запрос в конструктор, но у меня нет делегата. Как он может получить данные, когда я использую return -referenceData.Categories позже? Почему когда я пишу _categories = _referenceData.Categories _categories не обновляется при обновлении коллекции? Это также ссылка на _reference.Categories. - person Daniel; 18.02.2011
comment
Если возвращает только ссылку на _referenceData.Categories, а не значение. И эта ссылка обновляется внутри контекста, когда операция загрузки завершена. - person Sergey Vedernikov; 18.02.2011
comment
Хорошо, кажется, я понял :-) Большое спасибо за ваше терпение! - person Daniel; 18.02.2011