Buscar..


Parámetros

Parámetro Detalles
valor El valor para convertir de
tipo de objetivo El tipo que se está convirtiendo a
parámetro Valor opcional para controlar cómo funciona la conversión.
cultura Objeto CultureInfo - requerido si se necesita localización

Observaciones

El método Convert convierte el valor del origen (generalmente el modelo de vista) al objetivo (generalmente una propiedad de un control).

El método ConvertBack convierte el valor del destino a la fuente. Sólo es necesario si la unión es TwoWay o OneWayToSource .

Cuando no se ConvertBack un ConvertBack , es decir, no hay una asignación uno a uno entre el valor de pre-conversión y el valor de post-conversión, es una práctica común que el método ConvertBack devuelva DependencyProperty.UnsetValue . Es una mejor opción que lanzar una excepción (por ejemplo, NotImplementedException ) ya que evita errores de tiempo de ejecución inesperados. Además, los enlaces pueden beneficiarse de su FallbackValue cuando DependencyProperty.UnsetValue es devuelto por un convertidor.

Cadena a IsChecked Converter

En XAML:

<RadioButton IsChecked="{Binding EntityValue, Mode=TwoWay,
                         Converter={StaticResource StringToIsCheckedConverter},
                         ConverterParameter=Male}"
             Content="Male"/>

<RadioButton IsChecked="{Binding EntityValue, Mode=TwoWay,
                         Converter={StaticResource StringToIsCheckedConverter},
                         ConverterParameter=Female}"
             Content="Female"/>

La clase de C #:

public class StringToIsCheckedConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string input = (string)value;
        string test = (string)parameter;
        return input == test;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || !(value is bool))
        {
            return string.Empty;
        }
        if (parameter == null || !(parameter is string))
        {
            return string.Empty;
        }
        if ((bool)value)
        {
            return parameter.ToString();
        }
        else
        {
            return string.Empty;
        }
    }
}

Convertidores 101

Los controles XAML pueden tener propiedades de dependencia que pueden vincularse a objetos de DataContext u otros controles. Cuando el tipo de objeto que se está enlazando es diferente del tipo de la propiedad de DependencyProperty destino, se puede usar un convertidor para adaptar un tipo a otro.

Los convertidores son clases que implementan System.Windows.Data.IValueConverter o System.Windows.Data.IMultiValueConverter ; WPF implementa algunos convertidores listos para usar, pero los desarrolladores pueden ver el uso en implementaciones personalizadas, como suele ser el caso.

Para usar un convertidor en XAML, se puede crear una instancia de una instancia en la sección Resources . Para el ejemplo a continuación, se utilizará System.Windows.Controls.BooleanToVisibilityConverter :

<UserControl.Resources>
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</UserControl.Resources>

Observe el elemento x:Key definido, que luego se usa para hacer referencia a la instancia de BooleanToVisibilityConverter en el enlace:

<TextBlock Text="This will be hidden if property 'IsVisible' is true"
           Visibility="{Binding IsVisible, 
                                Converter={StaticResource BooleanToVisibilityConverter}}"/>

En el ejemplo anterior, una propiedad IsVisible booleana se convierte a un valor de la enumeración System.Windows.Visibility ; Visibility.Visible if true, o Visibility.Collapsed contrario.

Creación y uso de un convertidor: BooleanToVisibilityConverter e InvertibleBooleanToVisibilityConverter

Para ampliar y ampliar la experiencia de enlace, tenemos convertidores para convertir un valor de un tipo en otro valor de otro tipo. Para aprovechar los Convertidores en un enlace de datos, primero debe crear una clase DataConverter que extienda

  • IValueConverter (WPF y UWP)

o

  • IMultiValueConverter (WPF)

Si quieres convertir varios tipos en un solo tipo.
En este caso, nos centramos en convertir un valor boolean True/False a las correspondientes Visibilidades Visibility.Visible y Visibility.Collapsed . Visibility.Collapsed :

public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (value is bool && (bool) value) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return (value is Visibility && (Visibility) value == Visibility.Visible);
    }
}

La Convert método se llama cada vez que GET datos FROM el ViewModel .
El ConvertBack está llamada a SET ing datos TO del ViewModel para BindingMode.TwoWay enlaces.

Por supuesto, también puede utilizar propiedades dentro de su convertidor. Echa un vistazo a este:

public class InvertibleBooleanToVisibilityConverter : IValueConverter
{
    public bool Invert { get; set; } = false;

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return (value is bool && (bool) value != Invert) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return (value is Visibility && ((Visibility) value == Visibility.Visible) != Invert);
    }
}

Si desea usar un convertidor en un Binding , simplemente declare que es un recurso en su página, ventana u otro elemento, dele una clave y proporcione las propiedades potencialmente necesarias:

<Page ...
    xmlns:converters="using:MyNamespce.Converters">
<Page.Resources>
    <converters:InvertibleBooleanToVisibilityConverter 
        x:Key="BooleanToVisibilityConverter" 
        Invert="False" />
</Page.Resources>

y usarlo como StaticResource en un enlace:

<ProgressRing 
        Visibility="{Binding ShowBusyIndicator, 
            Converter={StaticResource BooleanToVisibilityConverter},
            UpdateSourceTrigger=PropertyChanged,
            Mode=OneWay}" />


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow