¿Cómo usar las propiedades de un UserControl desde su propio XAML?


En ocasiones veo Bindings… y no puedo dejar de usarlos. El caso es que estaba leyendo algunos ejemplos de databindings y me he topado con uno que no funcionaba correctamente. El ejemplo intentaba explicar cómo usar las dependency properties definidas en un UserControl directamente desde el XAML del mismo, ocupa cuatro páginas y usa un truco para poder acceder: dar un nombre al UserControl en la definición del mismo, algo así como:

<UserControl x:Class="MyLibrary.MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Name="this">

Entonces en el código podríamos usar la palabra “this” para hacer referencia al control y acceder a sus propiedades, así si tuvieramos una propiedad Label definida como DependencyProperty:

public static readonly DependencyProperty LabelProperty =
   DependencyProperty.Register("Label", typeof(string), typeof(MyUserControl),
   new PropertyMetadata("myLabel"));

public string Label
{
    get{ return (string) this.GetValue(LabelProperty);}
    set { this.SetValue(LabelProperty, value); }
}

Teóricamente podríamos usarla así:

        <TextBlock Height="Auto"
                   Text="{Binding ElementName=this, Path=Label}"
                   HorizontalAlignment="Center" VerticalAlignment="Center" />

Y al principio nos parecerá que funciona, hasta que se nos ocurra dar un nombre a nuestro control cuando lo usamos dentro de un contenedor:

        <my:MyUserControl x:Name="userControl1" .. />

Entonces se habrá acabado la magia, nuestro control ya no leerá la propiedad porque a alguien le dió por cambiarle el nombre.

Buscando por ahí he visto alguna solución alternativa, como por ejemplo crear el binding por código porque no encuentran la manera de definirlo bien en el XAML, pero hay una manera, lo sorprendente de todo esto es que la pista me la ha dado el mismo libro que contenía el ejemplo anterior, es tan sencillo como usar el Parent del elemento LayoutRoot, (o del contenedor principal del control que hayamos puesto):

<UserControl x:Class="MyLibrary.MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <TextBlock Name="label" Height="Auto" Margin="0"
                   Text="{Binding Path=Parent.Label, ElementName=LayoutRoot}"
                   HorizontalAlignment="Center" VerticalAlignment="Center" />
...

Así hemos conseguido usar la propiedad Label desde el TextBlock de nuestro UserControl sin tener que escribir código que se encargue de manejar los cambios, que para eso tenemos los Bindings.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s