Monthly Archives: January 2013

SelectedItem, SelectedValue

Los ComboBox, las ListBox y toda esa recua de controles tan útiles son unas verdaderas bestias. En realidad, todos los ItemsControl son tan bellos como complejos.

No entender qué cojopios hacen es una de las razones por la que creamos chorricode totalmente vomitivo. “ItemsControl”, quédate con el nombre. ¡Hay que estudiárselos bien!

A nivel de usuario hay básico entender este par de propiedades:

  • SelectedItem: El elemento seleccionado. Si tenemos un Binding TwoWay a esta propiedad debemos cuidar muy mucho ciertas cosas. Lo más importante:

    El elemento enlazado con el “binding” puede no existir en la lista. Si esto se produce, visualmente no se seleccionará NADA. Es decir, ningún elemento se marcará.

  • SelectedValue: Valor seleccionado. No importa si el elemento no está en la lista. Se selecciona y punto. Queda más claro si digo que en un combo box, el Popup desplegable lleva la lista de elementos, pero luego tiene un elemento especial, que es el que aparece en la cajita del combo cuando está cerrado. El SelectedValue se pondrá ahí. Lo malo es que no siempre es posible representar el elemento (puede ser un elemento no “renderizable”.

IMPORTANTE: Para que la cosa funcione es imprescindible sobreescribir los métodos Equals en los elementos que vayan a ser representados en el ItemsControl. Es lógico, puesto que, ¿cómo va a saber sino cuál elemento se selecciona de la lista si no existe una manera de comprobar cuándo son el mismo elemento?

WARNING: El método Equals por defecto compara referencias, por lo que si son la misma referencia, el SelectedItem furrula fairly good, pero cuando la instancia te la sacas tú de la manga, haces un clone y vete tú a saber qué historias, el Equals es obligatorio si quieres que todo se sincronice solito.

¡Esos Equals tan impopulares a los que nadie les hace caso son importantísimos! Úsalos o tendré que sacar el látigo de dar.

Duck Typing FTW

Para que no se te olvide, golferas, si quieres programar como Dios manda deberías hacerlo siempre intentando programar “contra” interfaces, aunque no es una expresión que me guste mucho eso de “contra”, pero así todo el mundo lo entiende.

Para facilitarnos la tarea existe una técnica llamada Duck Typing.

“Si anda como un pato, nada como un pato y vuela como un pato, entonces es un pato”.

En pocas palabras Duck Typing es conseguir tratar como un objeto fuese algo que realmente no lo es, aunque cumple con sus requisitos. Esto se traduce a tener tener un tipo que no implementa cierta interfaz, pero lo tratamos como si la implementase.

El gran Juan María Hernández (@gulnor) publica en su blog publica un artículo especialmente interesante donde explica muy bien qué es y cómo funciona, además de exponer una pequeña implementación de andar por casa ayudarnos a entender cómo funciona por dentro.

¿Cómo lo consigue? Con reflexión, invocando atributos y métodos como si realmente estuviésemos trabajando con el tipo que queremos.

Sin duda, un concepto revolucionario con lo que podemos crear código más abstracto  y menos acoplado, que es de lo que se trata.

Por cierto, si no quieres devanarte la sesera para hacerte tu propia implementación de esta , échale un vistazo al DynamicProxy o al aparentemente bueno ImpromptuInterface (http://code.google.com/p/impromptu-interface/).

Venga, a probarlo ya, ¡jodebles!

Databinding to Structs

Well, this is going to be rude: Binding to struct types can be a tricky. You will absolutely love when the UI just ignores every change. It refuses to update and eventually you’ll get mad about this, wondering why those nice bindings to Paddings or Margins are ignored. It’s kind of frustrating.

This boils down the nature of structs. They are value types and they’re taken as a whole by the dependency property mechanism.

When you define a DP that carries a struct, any binding to a child attribute that composes that struct reflects the actual value of that member, but ONLY when the struct is replaced by another “instance” of the struct (another value). Changing its attributes will not notify any change (Property Changed callbacks won’t be called).

For instance, you have a DP with a Point and a binding link this:

Text=”{Binding Path=MyPoint.X}”

Suppose that the X value of the struct is modified the some other binding (or whatever). You may expect the Text to reflect the X value anytime it is changed, but no way! WPF will blow you off, sticking out its long and complex tongue.

This is (not easily) solved replacing the value of the struct whenever you want the change to be reflected in the UI. “What? you mean that I have to care about changes in every member of the struct in order to have the bindings fresh like my cotton underwear”. Yes, that’s it!

Pretty annoying! but this is the price you have to pay for using those cute simplistic and handy structs!

Don’t forget it. Never! You sweated too much because of this Sonrisa! I hope you finally understood, Suppa JMN!

Y todo esto para tirarme el pegote de escribir en Inglés, ¡copón! Bueno, también es verdad que si algún lobo de mar angloparlante viene a mi blog por alguna casualidad de la vida, quizá le guste entender algo, ¿no?

Quitar comentarios de cabecera en código fuente

No hay nada más aburrido y cansino que quitar las cabeceras al código fuente. Hay peña que se dedica a ponerlas para decir “esto lo hemos hecho en tal empresa y mira qué enlaces más bonitos, y copyright y bla bla bla”. O sea, una pollez. El archivo de código fuente debe ser limpio, ¡código sin moñas! Pero es que además existen buenas razones para no meter brocilla:

Un merge entre 2 archivos con el código igualito menos los comentarios de cabecera. Te das cuenta de que todos los archivos tienen conflictos, ¿por qué? POR UN JODIDO COMENTARIO DE CABECERA.

Y lo peor es que da conflictos en todo. ¿Cómo discriminas los archivos que realmente contienen conflictos de los que no? 

Ayer me pasó. Y te dan ganas de pegarte un tiro.

Así es que aquí tienes la herramienta que te hará la vida más fácil.

License Header Manager for Visual Studio

Desde el Explorador de la Solución hay un menú contextual muy práctico:

image

Y ahora es cuando digo, oh really yeah!