13 julio 2006

Enlace a datos de un grupo de RadioButtons

Se me ha ocurrido una cuestión que daba por resuelta: si en una entidad tengo una propiedad que representa un valor enumerado, y quiero mostrarla en la interfaz de usuario con varios RadioButtons (esos circulicos de los que _sólo pué queá uno_), resulta que no puedo usar las propiedades de DataBinding directamente. Cada RadioButton ofrece una propiedad Checked buleana (mi contribución al DRAE), pero esto podría enlazarse si tuviera 2 RadioButton y la propiedad de la entidad fuera buleana también. En el caso que me ocupa, en que la propiedad no es buleana (cómo me recreo) sino un enumerado, no puede emplearse. Tendría que crear una propiedad buleana (olé) en la entidad por cada posible valor del enumerado (algo como IsValor1, IsValor2...) y enlazar cada una de estas al control RadioButton correspondiente. Pero lógicamente esta no será mi solución. Así que a guglear (eso, quememos el diccionario).

Una propuesta interesante es construir un control que representa un grupo de RadioButtons. El .NET Framework no lo ofrece, pero no es dificil de conseguir, aquí hay un ejemplo de uno en código fuente. Al verlo, me llevo una grata sorpresa por un problema que yo no había considerado. Yo pensaba introducir los RadioButtons uno a uno manualmente en la interfaz de usuario, pero aquí el amigo Hotdog (Robert Verpalen) plantea que el su control grupo de radiobuttons tenga un DataSource de donde cargue los controles. ¡Genial! Sólo una pega: el diseño o distribución de las opciones (RadioButtons) se hace dinámicamente, automáticamente, por lo que no podemos ajustarlo manualmente. Aunque esto es lo mejor y más aconsejable para la mayoría de los casos, tenemos que dar las dos posibilidades:
( ) rellenar opciones en diseño manualmente,
(·) o automáticamente a partir de un DataSource.

Otra propuesta, mucho menos elegante pero interesante por ser más sencilla, consiste en capturar los eventos Parse y Format del DataBinding. Esto nos obliga a establecer el DataBinding mediante código propio, no estableciendo propiedades en diseño. El evento Format se dispara al tratar de asignar un valor leído de la fuente de datos al control. El evento Parse, de forma complementaria, al asignar el valor establecido en el control de vuelta a la fuente de datos. De nuevo necesitamos código específico para estos dos eventos. Y no veo una forma sencilla y bien diseñada de generalizar este código.

Dejo de guglear, ya que no encuentro nada nuevo, sólo algunas críticas a la gente de .net por no incluir de forma nativa el soporte para este tipo de enlace a datos tan frecuente.

P.D. Está vivo este blog. Espero que siga así.

Etiquetas: