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!