web-dev-qa-db-fra.com

Formes Xamarin - annuler les valeurs de liaison booléennes

J'apprends les formes xamarin et le modèle mvvm. Je me demande s'il est possible d'annuler la valeur booléenne de liaison. Ce que je veux dire est:

J'ai, disons Entrée avec une liaison isVisible:

<Entry
    x:Name="TextEntry"
    IsVisible="{Binding IsVisibleEntry}"
/>

et Label que je veux cacher lorsque TextEntry est visible.

<Label x:Name="MainLabel" 
       isVisible="!{Binding IsVisibleEntry}"/> //ofc it is not working

Est-il possible de se passer d'une nouvelle variable pour MainLabel dans ViewModel?

14
Grzegorz G.

Première option: convertisseur

public class InverseBoolConverter : IValueConverter, IMarkupExtension
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return !((bool)value);
        }

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


        public object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }
    }

XAML

<Label x:Name="MainLabel" 
       isVisible="{Binding IsVisibleEntry, Converter={Helpers:InverseBoolConverter}}"/>

En-tête XAML

xmlns:Helpers="clr-namespace:HikePOS.Helpers"

Option deux: déclencheur

<Label x:Name="MainLabel" isVisible="{Binding IsVisibleEntry}">
    <Label.Triggers>
        <DataTrigger TargetType="Label" Binding="{Binding IsVisibleEntry}" Value="True">
            <Setter Property="IsVisible" Value="False" />
        </DataTrigger>
    </Label.Triggers>
</Label>
33
Ziyad Godil

Vous devrez créer un convertisseur inversé pour que votre liaison ressemble un peu à ceci:

public class InverseBoolConverter : IValueConverter
{
    public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !(bool)value;
    }
    public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !(bool)value;
    }
}

Dans votre XAML

<local:InverseBoolConverter x:Key="inverter"/>
<Entry
x:Name="TextEntry"
IsVisible="{Binding IsVisibleEntry, Converter={StaticResource inverter}}"
/>
7
praty