Xamarin Forms - negate bool binding values

2020-05-30 03:48发布

问题:

I am learning the xamarin forms and mvvm pattern. I am wondering, if is it possible to negate binding bool value. What I mean is:

I have, let's say Entry with isVisible Binding:

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

and Label which i want to hide when TextEntry is visible.

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

Is it possible to do without making a new variable for MainLabel in ViewModel?

回答1:

Option One: Converter

Define the converter:

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;
    }
}

Usage in XAML:

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

XAML Header

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

Option Two: Trigger

<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>


回答2:

You will need to create an Invert converter so your binding would look somewhat like this:

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;
    }
}

In your XAML

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