Windows Presentation Foundation y Entity Framework, poderosa combinación II: No todo lo que reluce es oro.

Una de las principales características de Windows Presentation Foundation (WPF) es el Data Binding, con el se puede unir de una forma rápida la interfaz de usuario con nuestras propiedades, ya sean datos de negocios o simplemente propiedades con las que se quieren controlar ciertas acciones de la interfaz.
Ahora bien, ¿qué aporta este Data Binding realmente? Pues lo que aporta es una forma de trabajar muy cómoda, tanto a nivel de diseño con Expression Blend o en código, de tal forma que si se tiene una serie de controles de texto que siempre utilizan la misma propiedad, al “bindear” estos controles a nuestra propiedad, solo se tiene que modificar el valor de la propiedad y todos los controles obtendrán ese valor en vez de tener que modificar manualmente el valor de cada uno de ellos.

Otro ejemplo muy visual, es el típico caso de que se quiere controlar la visibilidad o si son accesibles una serie de controles en función por ejemplo, de una política de usuario como puede ser, que sea o no administrador de la aplicación. En este caso bastaría con “bindear” la propiedad de visibilidad o de habilitado a una propiedad, y al cambiar el valor esta propiedad cambiarían la visibilidad o el estado de habilitado automáticamente, sin tener que tocar manualmente cada control.
Así que siguiendo esta filosofía, se puede “bindear” las entidades que suministra Entity Frammework (EF) para los formularios controles que se tengan que desarrollar y así poder utilizar esta potente característica, de tal forma que solo modificando los valores de las propiedades de las entidades que proporciona EF y que todo ello se refresque en nuestra interfaz.

Pero como dice el titulo de este post “No todo lo que reluce es oro”. ¿Y esto por qué? Pues porque el Data Binding de WPF está pensado para utilizarse con Dependency Properties, que es un tipo de propiedades un poco especiales, tienen varias características importantes, como que permite un coerce o validación de los datos, pero la característica que más importante para el caso que nos ocupa es que estas propiedades implementan INotifyPropertyChanged y heredan de la clase DepencyObject, con lo cual lanzan un evento de cambio cada vez que se actualiza la propiedad. Este evento de cambio lanzado por la propiedad es recogido por WPF y el gestiona automáticamente los cambios y actualiza los datos en pantalla sin tener que actualizar manualmente los valores en los controles.
¿Y cuál es nuestro problema? Pues por si no os habéis dado cuenta todavía, las entidades que proporciona EF, no implementan INotifyPropertyChanged, por lo tanto si “bindeamos” estas entidades la interfaz de WPF no se enterara de los cambios. Así que nuestro gozo en pozo y todas las expectativas e ilusiones se acaban de diluir.

Pero tampoco hay que desesperar, siempre se encuentra una solución. Básicamente se tienen tres posibilidades ante este problema.
La primera posibilidad es crear una Dependency Property del tipo de la entidad de EF, en el código subyacente del control de usuario a utilizar. Esta posibilidad tiene una gran limitación, y es que de esta forma la interfaz se da cuenta de los cambios de entidad no de los cambios de las propiedades de la entidad, así que este caso no es útil en la mayoría de los casos.

La segunda posibilidad es crear un nuevo grafo en memoria de las entidades de EF, pero esta vez heredando de DependencyObject y las propiedades siendo Dependency Properties. Esta posibilidad da toda el jugo a WPF y toda las posibilidades, pero en contra tiene que puede ser complicado y pesado reconstruir el grafo, sobre todo si se está trabajando con servicios, y que hay que manejar con mucho cuidado los cambios para que el contexto siempre siga la traza de nuestras Entidades.
La tercera posibilidad, no es tan potente como la anterior pero en muchos casos es suficiente. La forma de realizarlo es la siguiente: Se crean clases parciales de las entidades que proporciona EF y estas clases se hace que implementen INotifyPropertyChanged, ya que no se tiene ninguna restricción para implementar interfaces. Después se hace que las propiedades lancen en evento de cambio.

De esta forma WPF será consciente de los cambios y actualizara la interfaz de modo automático como si estuviera trabajando con Dependency Properties. Esta opción no da todas las posibilidades que si se usara Dependency Property pero en muchos casos será muy útil y suficiente.
Bueno y hasta aquí este segundo post sobre WPF y EF, espero que os haya parecido interesante u os resulte útil.

Un saludo, Anuar.

5 comentarios en “Windows Presentation Foundation y Entity Framework, poderosa combinación II: No todo lo que reluce es oro.”

  1. Yo hecho de menos un poco de código. Seguro que a los que no pilotamos WPF nos vendría muy bien para entender el problema totalmente. En cualquier caso, interesante post.

    ¡Un saludo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *