Tutorial 8 – Configurer mon arbre en lazy loading
La vidéo du Tutorial
Binding relationnel
Ajoutons un noeud fils à notre arbre.
|
Sélectionnez la vue ADWTree et le nœud ProductCategory
Cliquez sur le bouton Add Child pour ajouter un nœud Child.
Nous voulons que le nœud Child soit contextuel, c'est-à-dire que les données dépendent du Parent. En fait, les SubCategory affichées sont les SubCategory de la Category Parent.
Cliquez sur la case à cocher Contextual Node.
Le DataName que vous pouvez choisir est contextuel au DataName du nœud Parent, via une Relation du Schema.
Sélectionnez le DataName .ProductSubcategoryProductCategory.ProductSubcategory
Les Nœuds fils suivront la relation Parent/Child selon le Schema. |
|
|
Associez la Property Text du Nœud à la colonne Name de la Table.
Sauvegardez la configuration.
Lancez l’application pour constater le 2ème niveau de l’Arbre. |
|
Mais il n’y a pas de 2ème niveau ! Nous avons beau ouvrir les Nœuds Category, il n’y a pas de nœuds Child !
Ceci est en fait normal. Souvenez-vous que c’est la commande Server, appelée au chargement de la fenêtre, qui charge les données. Or le code de cette commande ne charge que les ProductCategory. Nous pouvons modifier notre code pour charger en même temps les ProductSubCategory :
DataSet IADWService.LoadInitialData()
{
IDataManager dm = EntityManager.FromDataBaseService("DataAccessAdventureWorks");
//dm.LoadEntities<ProductCategory>();
dm.LoadAssociated<ProductSubcategory, ProductSubcategoryProductCategory>();
return dm.Data;
}
L’API LoadAssociated nous permet de charger toutes les Associations entre ProductSubCategory et ProductCategory, en précisant la relation concernée; je pourrais avoir plusieurs relations entre mes entités, et nous devons préciser quelle relation nous voulons utiliser pour la jointure.
Si nous compilons notre solution et relançons l’application, nous constatons que les noeuds fils sont bien chargés cette fois-ci.
Mais ce n’est pas tout à fait ce que nous souhaitons, car les données sont chargées d’un seul coup, et nous voulons avoir un lazy loading, c’est à dire charger les données au fur et à mesure de l'ouverture des noeuds.
Nous allons donc ajouter une 2ème commande, qui charge les SubCategories associées à une Category donnée par son Id:
Dans Visual Studio, ajoutons une 2ème Commande à notre Interface.
Cette Commande a un paramètre productCategoryID.
|
|
Le code de la Commande charge les SubCategory associé à la Category dont l’ID est passé en paramètre.
Compilez la solution, pour que cette commande soit disponible dans BindingStudio. |
DataSet IADWService.LoadSubCategories(int productCategoryId)
{
IDataManager dm = EntityManager.FromDataBaseService("DataAccessAdventureWorks");
dm.LoadAssociated<ProductSubcategory, ProductSubcategoryProductCategory>(productCategoryId);
return dm.Data;
}
|
| Dans BindingStudio, nous allons binder cette nouvelle Commande sur l’évènement OnFirstExpand du noeud ProductCategory. |
|
Bindons notre Commande.
Le Result est mergé dans le DataSet ADWData. |
|
Le paramètre est bindé sur les données de l’arbre, le noeud Current.
Sauvons notre Application.
|
|
Si nous relançons l’application, nous constatons que notre arbre est bien rempli, comme précédemment. Par contre, d’un point de vue des échanges avec le Serveur, c’est complètement différent, puisqu’un aller et retour se produit, la première fois que nous ouvrons un noeud ProductCategory.
Nous avons réaliser un arbre en lazy loading, en quelques clics de souris, et sans ajouter le moindre code technique.
La suite, au prochain épisode.