TIP - "Bindeando" Converter Parameter en WinRT
¡Hola Geeks!
Quien esté trabajando con el modelo MVVM para aplicaciones en .NET, sabrás que existen los Converters (tenemos tutorial sobre ello). También harás visto que podemos hacer un Binding al parámetro de Converter. Si has tenido un proyecto que requería algo más de lógica y tener que pasar dos parámetros, tenemos a nuestras manos ConverterParameter. ConverterParameter, te habrás dado cuenta, que solo acepta valores hardcoded. Si intentas meter un Binding, lo más probable es que te de error.
¿Y si me pongo Cabezón y quiero bindearlo?
Todo desarrollador se ha puesto cabezón, lo sabemos. También sabemos que hasta no lo resolvamos de esa manera no se nos va a ir esa cabezonería. Por eso, si queréis saber cómo aprovecharnos del bindeo del ConverterParameter para dar un resultado más dinámico a la clase Converter, seguid leyendo.
Implementación
La idea es sencilla. Para que nuestro Converter tenga dichos dotes no solo va a poder bindear dos propiedades, sino que podrá hacerlo con todo objeto que se declare como dependency property en la clase. Lo explico mejor.
Creamos una clase Converter
Crearemos por ejemplo DistanceConverter, implementará IValueConverter con sus métodos Convert y ConvertBack.
public class DistanceConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } }
Una vez creada e implementada IValueConverter, pasaremos a declarar una propiedad de dependencia (dependency property). Esta propiedad es quien bindea nuestro objeto de la ViewModel y devuelva el valor apropiado para dicho control que estamos sometiendo al bindeo. No debemos olvidar implementar DependencyObject en la clase. La siguiente clase se quedaría así:
public class DistanceConverter : DependencyObject, IValueConverter { public UserViewModel CurrentUser { get { return (UserViewModel) GetValue(CurrentUserProperty); } set { SetValue(CurrentUserProperty, value); } } public static readonly DependencyProperty CurrentUserProperty = DependencyProperty.Register("CurrentUser", typeof (UserViewModel), typeof (DistanceConverter), new PropertyMetadata(null)); public object Convert(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } }
Definimos nuestro Converter en la View
Ahora nos queda definirlo en la Page.Resources de la View para luego poder utilizarlo como un bindeo en los controles de la página.
<Page.Resources> <converters:DistanceConverter x:Key="DistanceConverter" CurrentUser="{Binding User}" CurrentItem="{Binding CurrentItem}" MaxWidthAvailable="450" /> </Page.Resources>
Por último aplicar nuestro Converter
Una vez que tenemos declarado en la View, vamos a utilizarlo.
<Rectangle HorizontalAlignment="Left" VerticalAlignment="Center" Fill="#00FF84" Margin="10,0" Height="10" Width="{Binding Path=CurrentItem.Distance, Converter={StaticResource DistanceConverter}}"> </Rectangle>
Nota que hay que tener en cuenta:
No intentar declarar el converter en el control dentro, el bindeo se efectuará tarde y no tendrás el objeto de la ViewModel en tu dependency property de la clase Converter.
Hasta aquí es todo. Si os ha gustado, no os lo quedéis para vosotros, compartid
Happy Coding!