Indice de herramientas de Xamarin

Breve nombramiento de las herramientas de Xamarin, para ir repasando y no olvidar lo que existe y que podemos utilizar.

  1. Unity. paquete nuget. Contenedor de dependencias. Proyecto pertenece a Microsoft. Permite controlar mas facilmente las instancias ViewModels.
  2. MVVMCross. Framework multiplataforma que permite desarrollar aplicaceions multiplataforma. Sobretodo para enlace entre datos.
  3. XAML. Lenguaje de interfaz si usamos Xamarin.Forms.
  4. Paginas en Xamarin.Forms. Diferentes tipos de paginas.
  5. Layouts en Xamarin.Formas. Contenedores.
  6. Android: Actividades e Intents.
  7. Interfaz de usuario Android, arvhivos AXML.
  8. Layouts disponibles en Android.
  9. Controles basicos en Android.
  10. Storyboards. En iOS.
  11. AutoLayout. En iOS.
  12. Controles basicos en iOS.

Herramientas adicionales:

A. Xamarin Test Cloud. Dispositivos en la nueve para hacer pruebas.
B. Xamarin Insights. Analiticas en aplicaciones Xamarin.
C. Xamarin Android Player. Emular Android.
D. Xamarin Inspector. Inspección del arbol de efectos visuales.
E. Xamarin Live Player. Ver cambios al vuelo.

Como trabajar con base de datos:
https://javiersuarezruiz.wordpress.com/page/8/

Como crear con XAML interficie del usuario cross-platform UIs:
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/


Iconos gratuitos para aplicaciones:
https://icons8.com/icons/ios


Haplogrupo R1a, R1b Indice M269

De donde vienen y que significan

Tutankamón tiene haplogrupo R1b. En Europa R1b 60% tienen este haplogrupo. 

El Indice M269 de haplogrupo R1b viene desde Llanura europea oriental (Russkaya ravnina).

R1a – haplogrupo que es caracteristico para pueblos eslavos. R1b es haplogrupo caracteristico para pueblos eslavos, pero menos que R1a (1:10).

Gestión de modelos con “bundle”

Acabo de descubrir un sistema para gestión de todo tipo de código y dependencias, que no utilizaba para las paginas web. Se llama Webpack

Este bundle https://webpack.js.org permite tener el código mas ordenado, optimizar ancho de banda y gestionar bien las dependencias. Pero el futuro ya esta llegando con ECMAScript, que ya esta soportado por navegadores, así que solo es una herramienta buena pero supongo que dentro de un tiempo ya estará obsoleta.

Error en MySQL: Lock wait timeout exceeded; try restarting transaction

Si al ejecutar consultas que tardan mucho tiempo o procedimientos sale excepción en MySQL: “Lock wait timeout exceeded; try restarting transaction”.

Esto se puede arreglarse de la siguiente forma:

  1. Aumentar los tiempo de bloqueo:
    SET GLOBAL innodb_lock_wait_timeout = 5000;
    SET innodb_lock_wait_timeout = 5000;
    
  2. Matar los procesos colgados:
    SHOW PROCESSLIST;
    KILL XXX; /* Donde XXX es el numero del proceso colgado */
    

Porque se desaparecen bindings en XAML C#

Basicamente los binding’s desaparecen porque alguien los borra de alguna manera. Y como programadores normalmente no lo hacen, piensan que los binding’s de las propiedades siempre deben funcionar y siempre estan presentes, lo que no es verdad. Y hay un caso bastante facil de ver, pero complicado de entender que esta pasando.

Yo me encontre con la situación que despues de ver un CheckBox marcado gracias al binding, luego se queda marcado siempre y no me cambia el valor aún que se cambia el Context. Si el binding estaria funcionando, todo seria perfecto, pero no funcionaba. Al principio he pensado que problema esta con Mode=TwoWay/OneWay/etc, luego con posible problema de “UpdateTrigger” de la propiedad mostrada y en parte es correcto, pero el Binding en si, dejaba de existir asociado a propiedad “IsChecked”.

Para ver si existe binding podeis utilizar el codigo:

BindingExpression be = cbIsClient.GetBindingExpression(ToggleButton.IsCheckedProperty);

Si “be” es igual a “null”, no existe “binding” en esta propiedad.
Asi que si os deja de funcionar, en diferentes partes de codigo podeis ir detectando en que momento acaba desapareciendo. Gracias a esta investigación bastante manual vi un error mio que yo nunca consideraba que podria ser un error.

Imaginar el caso que tenemos un objeto “Coche” con una propiedad “Cliente”, la cual a su vez es un objeto. En pantalla con XAML dibujamos un CheckBox que tiene que estar marcado cuando “Coche.Cliente != null” y desmarcado cuando propiedad es nula. Se puede utilizar “Converter” personalizado para solventar este problema, pero necesitamos que salta el trigger si se cambia la propiedad “Coche.Cliente”. Si no lo podemos hacer de una forma facil por codigo, al no tener acceso a la propiedad “Cliente” (por ejemplo es de una libreria externa), yo pense que podria hacer simplemente:

cbIsClient.IsChecked = Coche.Cliente != null;

Y cuando pasa por esta parte de codigo se marca o se desmarca correctamente. El problema lo vi luego, al cambiar de un objeto “Coche” a otro de la lista. Vi que por si solo el CheckBox queda con el valor anterior si no fuerzo pasar por la linea de asignación directa y esto teniendo en CheckBox un binding con un converter.

Despues de investigar vi que el problema esta, en que al cargar primer “Coche” si que funcionaba el “binding” pero luego al pasar por “cbIsClient.IsChecked = Coche.Cliente != null;” lo que sucede, es que XAML piensa que apartir de ahora asignación sera manual y borra el binding. Asi luego si comprobamos con “GetBindingExpression” veremos que no hay ningun binding.

Sabiendo esto ya podeis encontrar solución, en mi caso al trabajar en codigo tube que crear algo asi:

coche.Cliente = new Client("123456789");
BindingExpression be = cbIsClient.GetBindingExpression(ToggleButton.IsCheckedProperty);
be?.UpdateTarget();

Mi problema era que no podria acceder a la propiedad y no me saltaba trigger, asi que sin asignar directamente al control, lo que hacia es forzar el disparo del binding del control despues de cambiar el valor por el codigo.