Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check object null value in xamarin forms data trigger?

I'm trying to check if a binding object value is null in Xamarin Forms XAML DataTrigger but I can't get it to work. I have tried the following:

<StackLayout IsVisible="True">
    <StackLayout.Triggers>
        <DataTrigger TargetType="StackLayout"
                        Binding="{Binding MyObject}"
                        Value="{x:Null}">
            <Setter Property="IsVisible" Value="False"></Setter>
        </DataTrigger>
    </StackLayout.Triggers>

    ...

</StackLayout>

Does anyone know a way to do it? I have tested this only on Android.

Edit: I have filed a bug report to xamarin bugzilla https://bugzilla.xamarin.com/show_bug.cgi?id=57863

like image 316
hamalaiv Avatar asked Jun 29 '17 11:06

hamalaiv


2 Answers

I know this is an old thread, but here is the solution:

Btw, you wouldn't need Isvisible="True" in the StackLayout because the default value is true.

<StackLayout IsVisible="True">
    <StackLayout.Triggers>
        <DataTrigger TargetType="StackLayout"
                        Binding="{Binding MyObject, TargetNullValue=''}"
                        Value="">
            <Setter Property="IsVisible" Value="False"></Setter>
        </DataTrigger>
    </StackLayout.Triggers>

    ...

</StackLayout>
like image 88
linktheory Avatar answered Oct 08 '22 01:10

linktheory


You can use converter and set to it its work for me. Lets try below code.

Converter Code

public class NullValueBoolConverter: IValueConverter, IMarkupExtension
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {

            if (value is string)
            {
                if (string.IsNullOrEmpty(value as string))
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {

                if (value == null)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }

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

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

And bind with IsVisible property like below :

<StackLayout IsVisible="{Binding Registerclosure.Notes, Converter={Helpers:NullValueBoolConverter}}">
</StackLayout>

Don't Forgot below line in header

xmlns:Helpers="clr-namespace:MyNameSpace"

like image 37
Ziyad Godil Avatar answered Oct 08 '22 01:10

Ziyad Godil