Social Icons

martes, 9 de noviembre de 2010

Cambiando el NewValue en el PropertyChangedCallback

Normalmente no escribo sobre Silverlight, básicamente es por dos razones, la primera es que todo viene perfectamente explicado en un montón de blogs justo al contrario que SharePoint y la segunda es porque tampoco trabajo tanto con Silverlight como para encontrarme problemas. Era perfecto hasta que lo conocí, como tantas otras cosas...


Últimamente estoy teniendo que usar bastante esta tecnología casi nueva para mí y ya desfasada para Microsoft y se me plantean dudas, como por ejemplo la de hoy.

Estaba creando un botón para añadirlo a una DataGrid como DataGridTemplateColumn y necesitaba crearme una DependencyProperty para poder hacer el Binding, hasta aquí todo más o menos claro, pero en el último momento cuando ya me veía victorioso me surgió una duda... si la propiedad (una URL en este caso) no cumple con los requisitos que yo quiero ¿Cómo hago para modificar el NewValue en el mismo PropertyChangedCallback?

El truco está en llamar a SetValue, que no dispara el evento, porque si no obviamente crearíamos un bucle infinito. Algo así.
public string CommentsURL
{
    get { return (string)GetValue(CommentsURLProperty); }
    set { SetValue(CommentsURLProperty, value); }
}

public static readonly DependencyProperty CommentsURLProperty =
    DependencyProperty.Register("CommentsURL", typeof(string), typeof(ButtonComments),
    new PropertyMetadata(new PropertyChangedCallback(ChangedURL)));

private static void ChangedURL(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    try
    {
        string url = e.NewValue.ToString().Split(',')[0];
        new Uri(url);
        d.SetValue(e.Property, url);

        (d as ButtonComments).IsEnabled = true;
    }
    catch
    {
        (d as ButtonComments).IsEnabled = false;
    }
}
Nótese la sutileza del código siempre intentando evitar una excepción antes de que se produzca.


Al final, por si alguien siente curiosidad, el webpart ha quedado así:


"Los intelectuales arreglan los problemas, los genios los evitan."

No hay comentarios: