visual tutorial studio que puede programacion presentacion hacer español ejemplos con animaciones wpf data-binding xaml ivalueconverter

tutorial - wpf presentacion



¿Hay alguna forma de encadenar convertidores de valores múltiples en XAML? (4)

Encontré exactamente lo que estaba buscando, cortesía de Josh Smith: Piping Value Converters (enlace archive.org) .

Él define una clase ValueConverterGroup , cuyo uso en XAML es exactamente lo que estaba esperando. Aquí hay un ejemplo:

<!-- Converts the Status attribute text to a SolidColorBrush used to draw the output of statusDisplayNameGroup. --> <local:ValueConverterGroup x:Key="statusForegroundGroup"> <local:IntegerStringToProcessingStateConverter /> <local:ProcessingStateToColorConverter /> <local:ColorToSolidColorBrushConverter /> </local:ValueConverterGroup>

Buena cosa. Gracias, Josh. :)

Tengo una situación en la que necesito mostrar un valor entero, vinculado a una propiedad en mi contexto de datos, después de pasarlo por dos conversiones separadas:

  1. Invierta el valor dentro de un rango (por ejemplo, el rango es de 1 a 100, el valor en el contexto de datos es 90, el usuario ve el valor de 10)
  2. convertir el número a una cadena

Me doy cuenta de que podría hacer ambos pasos creando mi propio convertidor (que implementa IValueConverter). Sin embargo, ya tengo un convertidor de valor por separado que hace solo el primer paso, y el segundo paso está cubierto por Int32Converter.

¿Hay alguna manera de encadenar estas dos clases existentes en XAML sin tener que crear una clase adicional que las agregue?

Si necesito aclarar algo de esto, házmelo saber. :)

Gracias.


Sí, hay formas de encadenar convertidores, pero no se ve bonito y no lo necesita aquí. Si alguna vez viene a necesitar esto, pregúntese ¿realmente es el camino a seguir? Simple siempre funciona mejor incluso si tiene que escribir su propio convertidor.

En su caso particular, todo lo que necesita hacer es formatear un valor convertido en una cadena. StringFormat propiedad StringFormat en un Binding es tu amigo aquí.

<TextBlock Text="{Binding Value,Converter={StaticResource myConverter},StringFormat=D}" />


Usé este método por Gareth Evans en mi proyecto de Silverlight.

Aquí está mi implementación de esto:

public class ValueConverterGroup : List<IValueConverter>, IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture)); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion }

Que luego se puede usar en XAML de esta manera:

<c:ValueConverterGroup x:Key="InvertAndVisibilitate"> <c:BooleanInverterConverter/> <c:BooleanToVisibilityConverter/> </c:ValueConverterGroup>


La implementación del proyecto Silverlight de Gareth Evans es excelente, pero no admite diferentes parámetros del convertidor.

Lo modifiqué para que pueda proporcionar parámetros, delimitados por comas (a menos que los escape, por supuesto).

Convertidor:

public class ValueConverterGroup : List<IValueConverter>, IValueConverter { private string[] _parameters; public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if(parameter != null) _parameters = Regex.Split(parameter.ToString(), @"(?<!//),"); return (this).Aggregate(value, (current, converter) => converter.Convert(current, targetType, GetParameter(converter), culture)); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } private string GetParameter(IValueConverter converter) { if (_parameters == null) return null; var index = IndexOf(converter as IValueConverter); string parameter; try { parameter = _parameters[index]; } catch (IndexOutOfRangeException ex) { parameter = null; } if (parameter != null) parameter = Regex.Unescape(parameter); return parameter; } }

Nota: ConvertBack no se implementa aquí, consulte mi Gist para obtener una versión actualizada.

Implementación:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:converters="clr-namespace:ATXF.Converters;assembly=ATXF" x:Class="ATXF.TestPage"> <ResourceDictionary> <converters:ValueConverterGroup x:Key="converters"> <converters:ConverterOne /> <converters:ConverterTwo /> </converters:ValueConverterGroup> </ResourceDictionary> <Label Text="{Binding InitialValue, Converter={StaticResource converters}, ConverterParameter=''Parameter1,Parameter2''}" /> </ContentPage>