Sélectionner dynamiquement un modèle
Un avantage considérable d’utilisation des modèles de commande est que vous pouvez provoquer une sélection dynamique d’un modèle, selon la situation de l’exécution. Par exemple un modèle différent peut être sélectionné conformément à l’entrée d’utilisateur ou conformément à l’environnement ou aux paramètres de l’appareil.
Dans notre fichier d'exemple Cities4-DynamicSelection.mtd, un modèle horizontal ou vertical est sélectionné conformément à l’orientation de l'appareil mobile (paysage ou portrait). Si l’appareil est tenu en orientation paysage, automatiquement des boutons radio horizontaux sont affichés. Si l’utilisateur change l’orientation de l’appareil (donc en portrait), l’affichage des touches radio change automatiquement en un affichage vertical. Cette fonction de design a été ajoutée à l’exemple précédent, Cities3-DynamicUpdates.mtd.
Note : | vous pouvez essayer cet exemple en modifiant l’orientation de l’appareil (en passant de paysage à portrait et inversement) lorsque la solution est exécutée ou en simulant un changement de l’orientation de l’appareil. Pour simuler un change de l’orientation pendant qu’une simulation est exécutée, cliquer sur la touche de la barre d’outils Changer Orientation (voir capture d’écran ci-dessous). |
La capture d’écran ci-dessus montre une simulation de Cities4-DynamicSelection.mtd dans l’orientation paysage. Vous verrez que le modèle de commande Boutons Radio Dynamiques (Horizontal) a été sélectionné automatiquement (à cause de l’orientation paysage) pour les deux ensembles des boutons radio, et, en résultat, l’appareil affiche automatiquement les boutons radio horizontalement.
Note : | nous connaissons l’orientation de l’appareil parce qu’elle est stockée dans les deux variables MobileTogether $MT_Landscape et $MT_Portrait (qui ont toutes les deux une valeur soit de true() soit de false()). |
Comment cela fonctionne ?
Pour pouvoir sélectionner dynamiquement des modèles, nous devons définir deux paramètres dans chaque Commande d’espace réservé :
•Une expression XPath pour spécifier les conditions dans lesquelles les modèles alternatifs sont sélectionnés respectivement (la propriété pertinente est marquée dans le volet Styles & Propriétés dans la capture d’écran ci-dessous)
•Une an XPath expression pour faire passer des valeurs de paramètre dans le modèle de commande sélectionné
Choisir le modèle de commande
L’expression XPath pour l’espace réservé qui instancie les boutons radio pour les pays est :
if ($MT_Landscape)
then 'Boutons Radio Dynamiques (Horizontal)'
else 'Boutons Radio Dynamiques (Vertical)'
Cette expression spécifie que si la variable globale $MT_Landscape a une valeur de true(), alors le modèle de commande nommé Boutons Radio Dynamiques (Horizontal) doit être utilisé, sinon (si $MT_Landscape=false()), le modèle de commande nommé Boutons Radio Dynamiques (Vertical) doit être utilisé. N’oubliez pas que cette expression doit être évaluée au nom du modèle de commande pour pouvoir être appelé, ce qui se produit pour chaque orientation (paysage et portrait).
L’expression XPath pour l’espace réservé qui instancie les boutons radio pour les villes est légèrement différent. Puisque certains pays ont de nombreuses villes (Italie 9 et USA 12), il est bien possible qu’il ne soit pas possible d’afficher horizontalement toutes les villes de ces pays dans une seule largeur d’écran, même dans l’orientation paysage. Nous avons donc limité la sélection du modèle horizontal (dans l’orientation paysage) aux pays présentant moins de 9 villes. Vous trouverez ci-dessous l’expression XPath, avec la partie qui compte le nombre de villes du pays sélectionné marqué en jaune.
if ($MT_Landscape and
count($COUNTRIES-AND-CITIES/Cities/Continent[@name=$PERSISTENT/Root/@Continent ]/Country[@name = $PERSISTENT/Root/@Country]/City/@name) lt 9)
then 'Boutons Radio Dynamiques (Horizontal)'
else 'Boutons Radio Dynamiques (Vertical)'
L’effet des définitions ci-dessus est que : (i) dans l’orientation paysage, toutes les listes des pays sont horizontales, alors que dans l’orientation portrait elles sont verticales ; (ii) dans l’orientation paysage, les listes de 1 à 8 villes sont affichées horizontalement alors que les listes contenant plus de 8 villes sont affichées verticalement ; dans l’orientation portrait toutes les listes de ville sont affichées verticalement.
Définir les valeurs de paramètre pour la passer aux modèles
L’expression XPath pour passer des valeurs dans les paramètres du modèle de commande sélectionné (voir capture d’écran ci-dessous) doit être soit une expression array soit une expression map. N’oubliez pas que vous ne savez pas quel modèle sera appelé au moment de l’exécution. Néanmoins, vous savez que le choix s’effectuera entre deux modèles et qu’ils ont tous les deux paramètres avec les mêmes noms. Étant donné que les deux paramètres ont le même nom, l’expression XPath pour attribuer des valeurs est plus simple.
Pour le premier espace réservé, nous avons utilisé une expression array (voir ci-dessous). L’array doit consister en deux séquences (parce que nous avons deux paramètres), la première séquence (marqué en jaune ci-dessous) fournit la valeur du premier paramètre et la seconde séquence (marqué en bleu) fournit la valeur du second paramètre. La première séquence génère la valeur du paramètre $values et évaluera à une liste de pays du continent sélectionné. La seconde séquence génère la valeur du paramètre $sort et évaluera à true() ou false(). Veuillez noter que l’ordre des séquences dans l’array doit correspondre à l’ordre des définitions du paramètre dans le projet, et doit inclure des valeurs pour tout les paramètres optionnels qui peuvent être la séquence vide () si aucune valeur n’est nécessaire.
[
($COUNTRIES-AND-CITIES/Cities/Continent[@name=$PERSISTENT/Root/@Continent]/Country/@name) ,
(if ($PERSISTENT/Root/@SortCountries=1) then true() else false())
]
Pour le second espace réservé, vous avons utilisé une expression map (voir ci-dessous). Le map doit consister en des paires de key:value, où la clé doit être le nom du paramètre. Les paires key:value peuvent être fournies dans n’importe quel ordre.
map{
"values":($COUNTRIES-AND-CITIES/Cities/Continent[@name=$PERSISTENT/Root/@Continent ]/Country[@name = $PERSISTENT/Root/@Country]/City/@name),
"sort":if ($PERSISTENT/Root/@SortCities=1) then true() else false()
}