Ответ 1
В прошлом я делал что-то подобное, и я забыл о том, что вы не можете назвать свое свойство async каким-либо кодом и ожидать, что он будет иметь значение.
Итак, если я lazy-load список Customer.Products
, я не могу ссылаться на Customer.Products.Count
в коде, потому что первый раз, когда он вызвал это значение, равен NULL или 0 (в зависимости от того, создаю ли я пустую коллекцию или нет)
Кроме того, он отлично справился с привязками. Я использовал библиотеку Async CTP для создания своих асинхронных вызовов, которые, как я нашел, были совершенно прекрасны для чего-то вроде этого.
public ObservableCollection<Products> Products
{
get
{
if (_products == null)
LoadProductsAsync();
return _products;
}
set { ... }
}
private async void LoadProductsAsync()
{
Products = await DAL.LoadProducts(CustomerId);
}
Обновление
Я помню, что у меня были проблемы с данными, которые на самом деле были NULL. Если Customer.Products действительно вернул значение NULL с сервера, мне нужно было знать, что метод async работал правильно и фактическое значение было нулевым, чтобы он не перезапускал метод async.
Я также не хотел, чтобы метод async запускался дважды, если кто-то вызвал метод Get во второй раз до того, как завершился первый асинхронный вызов.
Я решил это в то время, имея свойство Is[AsyncPropertyName]Loading/ed
для каждого свойства async и установив его в true во время первого асинхронного вызова, но мне не очень понравилось создавать дополнительное свойство для всех свойств async.