« Converter » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
Ligne 2 : Ligne 2 :
= ValueConverter =
= ValueConverter =
<kode lang="xaml">
<kode lang="xaml">
<UserControl xmlns:my="clr-namespace:CurrentNameSpace">
<UserControl xmlns:conversion="clr-namespace:MyNamespace.Conversion">


     <UserControl.Resources>
     <UserControl.Resources>
         <my:MyConverter x:Key="myConverter"/>
         <conversion:EnumerableToVisibilityConverter x:Key="EnumerableToVisibilityConverter" />
     </UserControl.Resources>
     </UserControl.Resources>


     <TextBlock Text="{Binding Path=., Converter={StaticResource ResourceKey=myConverter}}" />
     <TextBlock Text="{Binding MyProperty, Converter={StaticResource EnumerableToVisibilityConverter}}" />
</kode>
</kode>


<kode lang="csharp">
<kode lang="csharp">
namespace CurrentNameSpace
namespace MyNamespace.Conversion
{
{
     // L'attribut ValueConversion est optionel,
     // L'attribut ValueConversion est optionel,
     // il permet de spécifier le type d'entrée et le type de sortie
     // il permet de spécifier le type d'entrée et le type de sortie
     [ValueConversion(typeof(int), typeof(string))]
     [ValueConversion(typeof(IEnumerable), typeof(Visibility))]
     public class MyConverter : IValueConverter
     public class EnumerableToVisibilityConverter : IValueConverter
     {
     {
         public object Convert(object values, Type targetType, object parameter, CultureInfo culture)
         public object Convert(object values, Type targetType, object parameter, CultureInfo culture)
         {
         {
             var binding1Value = (int)values;
             if (value is IEnumerable itemCollection)
             ...
             {
             return ""; // un string
                return itemCollection.Cast<object>().Any() ? Visibility.Visible : Visibility.Collapsed;
            }
 
             return Visibility.Collapsed;
         }
         }


Ligne 29 : Ligne 32 :
         public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
         public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
         {
         {
            throw new NotSupportedException();
             throw new NotImplementedException();
             throw new NotImplementedException();
            return null;
         }
         }
     }
     }

Version du 15 avril 2020 à 16:24

ValueConverter

Xaml.svg
<UserControl xmlns:conversion="clr-namespace:MyNamespace.Conversion">

    <UserControl.Resources>
        <conversion:EnumerableToVisibilityConverter x:Key="EnumerableToVisibilityConverter" />
    </UserControl.Resources>

    <TextBlock Text="{Binding MyProperty, Converter={StaticResource EnumerableToVisibilityConverter}}" />
Csharp.svg
namespace MyNamespace.Conversion
{
    // L'attribut ValueConversion est optionel,
    // il permet de spécifier le type d'entrée et le type de sortie
    [ValueConversion(typeof(IEnumerable), typeof(Visibility))]
    public class EnumerableToVisibilityConverter : IValueConverter
    {
        public object Convert(object values, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is IEnumerable itemCollection)
            {
                return itemCollection.Cast<object>().Any() ? Visibility.Visible : Visibility.Collapsed;
            }

            return Visibility.Collapsed;
        }

        // Conversion inverse non-implémentée
        public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
            throw new NotImplementedException();
            return null;
        }
    }
}

Inverted convertion

Xaml.svg
<TextBlock Visibility="{Binding MyProperty, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=Inverted}" />
BooleanToVisibilityConverter.cs
[ValueConversion(typeof(bool), typeof(Visibility))]
public sealed class BooleanToVisibilityConverter : IValueConverter
{
    public object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool visibleFlag;
        if (value is bool b)
        {
            visibleFlag = b;
        }
        else
        {
            return DependencyProperty.UnsetValue;
        }

        if (parameter != null)
        {
            if (Enum.TryParse(parameter.ToString(), true, out Parameters invert) && invert == Parameters.Inverted)
            {
                visibleFlag = !visibleFlag;
            }
        }

        return visibleFlag ? Visibility.Visible : Visibility.Collapsed;
    }

    public object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    private enum Parameters
    {
        Normal,
        Inverted
    }

MultiValueConverter

Xaml.svg
<UserControl xmlns:my="clr-namespace:CurrentNameSpace">

    <UserControl.Resources>
        <my:MyConverter x:Key="myConverter"/>
    </UserControl.Resources>

    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource ResourceKey=myConverter}">
            <Binding ... />
            <Binding ... />
        </MultiBinding>
    </TextBlock.Text>
Csharp.svg
namespace CurrentNameSpace
{
    // L'attribut ValueConversion n'est pas utilisé ici car il n'est pas adapté
    // au MultiValueConverter : il ne peut définir qu'un seul type d'entrée
    public class MyConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            var binding1Value = (int)values[0];
            var binding2Value = (string)values[1];
            ...
            return ""; // un string
        }

        // Conversion inverse non-implémentée
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}