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
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.
0 votes
La solution la plus simple que j'ai trouvée est de créer une propriété dans le modèle qui renvoie la valeur négative de l'original. public bool ShowMyControl { get { return !theValue ; } } Dans WPF Visibility="{Binding MyModel.ShowMyControl, Converter={StaticResource BooleanToVisibilityConverter}}"