164 votes

Comment inverser le BooleanToVisibilityConverter ?

J'utilise un BooleanToVisibilityConverter dans WPF pour lier la propriété Visibility d'un contrôle à un booléen. Cela fonctionne bien, mais j'aimerais que l'un des contrôles soit masqué si le booléen est vrai, et affiché s'il est faux.

Est-ce possible ?

Merci, Andy

0 votes

Note : à partir de la version bêta 4, silverlight n'inclut pas BooleanToVisibility - vous devrez donc l'implémenter vous-même.

0 votes

Ajout d'une suggestion vocale de l'utilisateur pour obtenir le support de l'inversion. visualstudio.uservoice.com/forums/121579-visual-studio-2015/

0 votes

Je ne peux pas croire qu'ils n'aient pas implémenté des paramètres de convertisseur pour faire de telles choses.

18voto

Ross Oliver Points 140

Ou la méthode de la fainéantise, utiliser ce qui est déjà là et le retourner :

public class InverseBooleanToVisibilityConverter : IValueConverter
{
    private BooleanToVisibilityConverter _converter = new BooleanToVisibilityConverter();

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var result = _converter.Convert(value, targetType, parameter, culture) as Visibility?;
        return result == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var result = _converter.ConvertBack(value, targetType, parameter, culture) as bool?;
        return result == true ? false : true;
    }
}

3voto

Rhyous Points 2163

Je viens de rédiger un article sur ce sujet. J'ai utilisé une idée similaire à celle de Michael Hohlios. Seulement, j'ai utilisé des propriétés au lieu d'utiliser le "paramètre objet".

Lier la visibilité à une valeur bool dans WPF

L'utilisation des propriétés le rend plus lisible, à mon avis.

<local:BoolToVisibleOrHidden x:Key="BoolToVisConverter" Collapse="True" Reverse="True" />

0 votes

Juste un suivi de mon propre commentaire. Si vous utilisez des propriétés, vous devez créer un objet séparé si vous voulez créer des convertisseurs, un qui est inversé et un autre non. Si vous utilisez les paramètres, vous pouvez utiliser un objet pour plusieurs éléments, mais cela peut être déroutant si vous ne faites pas attention. Il y a donc du pour et du contre dans les deux cas.

0 votes

J'ai trouvé cela très utile pour réaliser des convertisseurs booléens en couleurs. Je vous remercie

3voto

xr280xr Points 2057

En voici un que j'ai écrit et que j'utilise beaucoup. Il utilise un paramètre de convertisseur booléen qui indique si la valeur doit être inversée ou non, puis utilise XOR pour effectuer la négation :

[ValueConversion(typeof(bool), typeof(System.Windows.Visibility))]
public class BooleanVisibilityConverter : IValueConverter
{
    System.Windows.Visibility _visibilityWhenFalse = System.Windows.Visibility.Collapsed;

    /// <summary>
    /// Gets or sets the <see cref="System.Windows.Visibility"/> value to use when the value is false. Defaults to collapsed.
    /// </summary>
    public System.Windows.Visibility VisibilityWhenFalse
    {
        get { return _visibilityWhenFalse; }
        set { _visibilityWhenFalse = value; }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool negateValue;
        Boolean.TryParse(parameter as string, out negateValue);

        bool val = negateValue ^ System.Convert.ToBoolean(value); //Negate the value using XOR
        return val ? System.Windows.Visibility.Visible : _visibilityWhenFalse;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool negateValue;
        Boolean.TryParse(parameter as string, out negateValue);

        if ((System.Windows.Visibility)value == System.Windows.Visibility.Visible)
            return true ^ negateValue;
        else
            return false ^ negateValue;
    }
}

Voici une table de vérité XOR pour référence :

        XOR
        x  y  XOR
        ---------
        0  0  0
        0  1  1
        1  0  1
        1  1  0

1voto

Muad'Dib Points 14260

Écrivez votre propre conversion.

public class ReverseBooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
       // your converter code here
   }
}

0voto

Gregor S. Points 1867

Une version simple à sens unique qui peut être utilisée comme ceci :

Visibility="{Binding IsHidden, Converter={x:Static Ui:Converters.BooleanToVisibility}, ConverterParameter=true}

peut être mis en œuvre comme suit :

public class BooleanToVisibilityConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    var invert = false;

    if (parameter != null)
    {
      invert = Boolean.Parse(parameter.ToString());
    }

    var booleanValue = (bool) value;

    return ((booleanValue && !invert) || (!booleanValue && invert)) 
      ? Visibility.Visible : Visibility.Collapsed;
  }

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X