Roberto Sánchez Programador/Desarrollador .NET

Binding.

Casi cualquier aplicación se basa en la mediación de la interacción entre el usuario y los datos, es decir, que podríamos definir una aplicación como el mediador que hace posible que un usuario haga uso de datos que son de su interés. Por ejemplo, en una aplicación de gestión de clientes, el usuario necesita acceder a los datos de sus clientes que se encuentran en una base de datos para poder modificarlos, consultarlos, poder sacar listados e informes, etc. Sin embargo, como es de suponer, el usuario no tiene conocimientos en programación de bases de datos, así que necesita de una aplicación informática que facilite ese manejo de los datos. Casi cualquier lenguage de programación permite lo anterior, mejor o peor presentado, mejor o peor eficaz, etc. WPF, en combinación con C#, nos permite la contrucción de aplicaciones potentes que, además de muchas cosas más, nos permitirá solucionar cualquier necesidad de interacción del usuario con los datos de su interés.

Y en un caso como el anterior, es fundamental que los datos interaccionen con la aplicación de una manera eficaz para el programador, es decir, que no sea necesario que el programador tenga que picar cientos de líneas de código fuente para mostrar datos en pantalla, modificarlos, etc., según las acciones del usuario. WPF, a través de la clase 'Binding', permite una interacción inmediata y efectiva entre los datos y capa de presentación. Veamos un ejemplo:

<StackPanel Orientation="Vertical">
    <ListView x:Name="listViewNames" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200">
        <ListViewItem Content="Zipi"/>
        <ListViewItem Content="Zape"/>
    </ListView>
    <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
        <Label Content="Total registros:"/>
        <Label Content="{Binding Items.Count, ElementName=ListViewNames, Mode=OneWay}"/>
    </StackPanel>
</StackPanel>

Tenemos un control 'ListView' que contiene dos items, cada uno un control 'ListViewItem' cuyo contenido son los nombres 'Zipi' y 'Zape'. Debajo tenemos una etiqueta simple que nos informa del total de registros del 'ListView', pero esta etiqueta no nos interesa. Nos interesa la siguiente, cuya propiedad 'Content' se ha enlazado a datos a través de la clase 'Binding'. Hemos establecido que se enlazará al elemento llamado 'listViewNames, mostrará el númetro total de items de éste y, además lo hará en un sentido.

Modo 'OneWay'.

¿Qué significa que enlazará en un sentido? Pues que tomará el valor de la lista total de items y lo volcará a la propiedad 'Content' de la etiqueta, en ese sentido y no al contrario. Así lo hemos hecho ahora, por lo que, imaginemos que cambiamos el contenido de la etiqueta, lógicamente el número de items del 'ListView' no cambiará.

Sin embargo, hay otros modos de enlace, como son 'TwoWay' (en los dos sentidos), 'OneTime' (una sóla vez aunque haya cambios posteriores) y 'OneWayToSource' (un sólo sentido pero al contrario del indicado). Esto ahora te puede parecer un poco complicado. PAra que te quedes tranquilo, puedo asegurarte que en la mayoría de los casos únicamente utilizarás 'OneWay' y 'TwoWay', por lo que ahora no voy a profundizar mucho los modos. Es suficiente que te hayas quedado bien con la idea que he explicado y en la que te voy a explicar a continuación.

Modo 'TwoWay'.

Si has entendido bien el modo 'OneWay', pasemos entonces al modo 'TwoWay'. No tiene dificultad ninguna. Solamente hay que pensar ahora en que en el modo 'TwoWay' ambos controles enlazados pueden cambiar en función del cambio que se produzca en el otro. Veamos el siguiente ejemplo ampliado del anterior:

<StackPanel Orientation="Vertical">
    <ListView x:Name="listViewNames" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200">
        <ListViewItem Content="Zipi"/>
        <ListViewItem Content="Zape"/>
    </ListView>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
        <Label Content="Total registros:"/>
        <Label Content="{Binding Items.Count, ElementName=ListViewNames, Mode=OneWay}"/>
    </StackPanel>
    <Slider x:Name="sliderTest" Margin="0,50,0,10" Maximum="100" Minimum="0" Width="300"/>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
        <Label Content="Valor 'Slider':"/>
        <Textbox Text="{Binding Value, ElementName=sliderTest, Mode=TwoWay, StringFormat=\{0:F0\}}" VerticalContentAlignment="Center" Width="100"/>
    </StackPanel>
</StackPanel>

Ejecuta este código y comprueba que el valor del control 'Slider' se vuelca automáticamente hacia el valor de la propiedad 'Test' de la caja de texto. Comprueba también que, si tecleamos un valor numérico en la caja de texto, al cambiar el foco de la misma, por ejemplo, pulsando en el control 'ListView', el control 'Slider' cambiará, porque también hemos enlazado a la propiedad 'Value' del 'Slider' con el modo 'TwoWay'.