Search code examples
c#xamarinmvvmxamarin.forms

Xamarin Forms - negate bool binding values


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.

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

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


Solution

  • Option One: Converter

    Define the converter:

        public class InverseBoolConverter : IValueConverter
        {
            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();
            }
        }
    

    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>