Una de las mayores ventajas de usar las plantillas de control es que se pueden seleccionar de forma dinámica en función del momento de ejecución. Por ejemplo, puede configurar que se seleccione una plantilla distinta según los datos de entrada del usuario o el entorno o la configuración del dispositivo.
En nuestro archivo de ejemplo Cities4-DynamicSelection.mtd se selecciona una plantilla vertical u horizontal en función de la orientación del dispositivo móvil. Si el dispositivo se usa con orientación horizontal, entonces aparecen automáticamente los botones en horizontal. Si el usuario cambia la orientación del dispositivo a vertical, los botones cambian automáticamente a los de la plantilla vertical. Hemos añadido esta característica del diseño al ejemplo previo, Cities3-DynamicUpdates.mtd.
Nota: | para probar este ejemplo cambie su dispositivo de una orientación a otra mientras está ejecutando la solución o en el simulador. Para simular un cambio de orientación en el simulador haga clic en el botón de la barra de herramientas Cambiar orientación (imagen siguiente). |
La imagen anterior muestra una simulación de Cities4-DynamicSelection.mtd con orientación horizontal. En ella se ha seleccionado automáticamente (debido a la orientación horizontal) la plantilla de control Botones de opción dinámicos (horizontal) para los dos conjuntos de botones de opción, como resultado, el dispositivo muestra automáticamente los botones de opción en horizontal.
Nota: | la orientación del dispositivo se sabe porque está almacenada en las variables de MobileTogether $MT_Landscape y $MT_Portrait (ambas tienen un valor true() o false()). |
Para seleccionar plantillas de forma dinámica necesitamos definir dos opciones en cada uno de los controles Marcador de posición:
•una expresión XPath para indicar las condiciones bajo las cuales se seleccionan las plantillas alternativas (la propiedad relevante está resaltada en el panel Estilos y Propiedades en la imagen siguiente)
•una expresión XPath para pasar valores de parámetros a las plantillas de control seleccionadas
La expresión XPath para el marcador de posición que instancia los botones de opción para países es:
if ($MT_Landscape)
then 'Dynamic Radio Buttons (Horizontal)'
else 'Dynamic Radio Buttons (Vertical)'
Esta expresión indica que si la variable global $MT_Landscape tiene el valor true (), entonces se debe usar la plantilla de control Botones de opción dinámicos (horizontal); en caso contrario (es decir, si $MT_Landscape=false()) se debe usar la plantilla de control Botones de opción dinámicos (vertical). Recuerde que esta expresión debe evaluar en el nombre de la plantilla de control a la que quiere llamar, que es lo que hace ahora para cada orientación (horizontal y vertical).
La expresión XPath para el marcador de posición que instancia botones de opción para ciudades es algo distinto. Como algunos países contienen un número elevado de ciudades (Italia 9 y EE UU 12), puede que no sea posible mostrar todas las ciudades de estos países en horizontal en el espacio de la pantalla, incluso aunque el dispositivo esté en orientación horizontal. Por esa razón hemos limitado la selección de la plantilla horizontal a los países que contienen menos de 9 ciudades. A continuación mostramos la expresión XPath correspondiente, con la parte que cuenta el número de ciudades del país resaltada en amarillo.
if ($MT_Landscape and
count($COUNTRIES-AND-CITIES/Cities/Continent[@name=$PERSISTENT/Root/@Continent ]/Country[@name = $PERSISTENT/Root/@Country]/City/@name) lt 9)
then 'Dynamic Radio Buttons (Horizontal)'
else 'Dynamic Radio Buttons (Vertical)'
El efecto de estas definiciones es que: (i) en orientación vertical, las listas de todos los países aparecen en horizontal y en orientación vertical aparecen en vertical; (ii) en orientación horizontal las listas de hasta 8 ciudades aparecen en horizontal, pero si la lista contiene más de 9 ciudades, estas aparecen enumeradas en vertical; si el dispositivo está en orientación vertical todas las listas de ciudades aparecen en vertical.
La expresión XPath que pasa los valores a los parámetros de la plantilla de control seleccionada () debe ser una expresión de matriz o una expresión de asignación. Tenga en cuenta que no sabemos a qué plantilla se llama en el momento de ejecución. Lo que sí sabemos es que se llama a una de dos plantillas y que esas dos plantillas tienen cada una dos parámetros con los mismos nombres. El hecho de que los parámetros tengan el mismo nombre hace que la expresión XPath para asignar valores sea más sencilla.
Para el primer marcador de posición hemos usado una expresión de matriz (véase más abajo). La matriz debe consistir en dos secuencias (porque hay dos parámetros) de las que la primera (resaltada en amarillo) suministra el valor del primer parámetro y la segunda (resaltada en azul) suministra el valor del segundo parámetro. La primera secuencia genera el valor del parámetro $values y evalúa en una lista de países del continente seleccionado. La segunda secuencia genera el valor del parámetro $sort y evalúa en true() o false(). Tenga en cuenta que el orden de las secuencias de la matriz debe coincidir con el de las definiciones de los parámetros en el proyecto y debe incluir valores para cualquier parámetro opcional que haya, aunque sea una secuencia vacía () si no es necesario ningún valor.
[
($COUNTRIES-AND-CITIES/Cities/Continent[@name=$PERSISTENT/Root/@Continent]/Country/@name),
(if ($PERSISTENT/Root/@SortCountries=1) then true() else false())
]
Para el segundo marcador de posición hemos usado una expresión de asignación (véase más abajo). La asignación debe consistir en pares key:value donde la clave debe ser el nombre del parámetro. Puede suministrar los pares key:value en el orden que quiera.
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()
}