laura.p
laura.p

Reputation: 11

Make sure an item is picked with Picker Xamarin Forms

I'm currently working on a cross-platform app build with Xamarin Forms and I've several picker. I need to be sure all the pickers have a selected item, and if not I'd like to set their background to red. I've already tried to loop to each element of the stacklayout to pick all Pickers and check their selected items but it's not working (it seems that my layout have only 2 children and no pickers). I cant't see how to do this with behavior too.

My loop (in code behind)

 public void checkChampsVides()
    {
        for (int i = 0; i < DiagHabitat.Children.Count(); i++)
        {
            DisplayAlert("e", DiagHabitat.Children.GetHashCode().ToString(), "ok");
            if (DiagHabitat.Children.ElementAt(i).GetType() == typeof(Picker))
            {

                Picker p = DiagHabitat.Children.ElementAt(i) as Picker;
                if (p.SelectedIndex == 0)
                    p.BackgroundColor = Color.Red;
            }
        }

    }

Xaml

<ContentPage 
Title="Diagnostic Habitat"
Padding="20"
xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="XXX.DiagnosticHabitatPage">
<ContentPage.Resources>
    <ResourceDictionary>
        <Style x:Key= "BoutonSauvegarde" TargetType="Button" >
            <Setter Property="BackgroundColor" Value="#6AD0C6"/>
        </Style>
    </ResourceDictionary>
</ContentPage.Resources>

<StackLayout  x:Name="DiagHabitat">
    <ProgressBar Progress="1"/>

    <TableView x:Name ="DiagnosticHabitat" Intent="Form"  HasUnevenRows="True">

        <TableRoot Title="Diagnostic habitat">


            <TableSection Title="Title1">
                <ViewCell>
                    <StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand" >
                        <Label VerticalOptions="Center" Text="text1"/>
                        <Picker x:Name="accesPorteEntree" HorizontalOptions="FillAndExpand" SelectedIndex="{Binding DiagHabitatAjoute.AccesPorteEntreeEPC, Mode=OneWayToSource}" >
                            <Picker.Items>
                                <x:String>Seuil haut</x:String>
                                <x:String>Seuil bas</x:String>
                                <x:String>Sans seuil</x:String>
                            </Picker.Items>
                        </Picker>
                    </StackLayout>
                </ViewCell>
                <ViewCell>
                    <StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand" >
                        <Label VerticalOptions="Center" Text="text2"/>
                        <Picker x:Name="niveauSecuAcces" HorizontalOptions="FillAndExpand" SelectedIndex="{Binding DiagHabitatAjoute.SecuAccesEPC, Mode=OneWayToSource}">
                            <Picker.Items>
                                <x:String>Bas</x:String>
                                <x:String>Moyen</x:String>
                                <x:String>Haut</x:String>
                            </Picker.Items>
                        </Picker>
                    </StackLayout>
                </ViewCell>

                <ViewCell>
                    <StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand" >
                        <Label VerticalOptions="Center" Text="Largeur circulation"/>
                        <Picker x:Name="largeurCirculation" HorizontalOptions="FillAndExpand" SelectedIndex="{Binding DiagHabitatAjoute.LargeurCircuEPC, Mode=OneWayToSource}" >

                            <Picker.Items>
                                <x:String>Inf à 75 cm</x:String>
                                <x:String>75 - 90 cm</x:String>
                                <x:String>Sup à 90 cm</x:String>
                            </Picker.Items>
                        </Picker>
                    </StackLayout>
                </ViewCell>

...

Upvotes: 0

Views: 1537

Answers (2)

Sharada
Sharada

Reputation: 13601

You can use triggers, and apply them using implicit Style.

<TableView.Resources>
    <ResourceDictionary>
        <Style TargetType="Picker">
            <Setter Property="BackgroundColor" Value="Green" />
            <Style.Triggers>
                <Trigger TargetType="Picker" Property="SelectedItem" Value="{x:Null}">
                    <Setter Property="BackgroundColor" Value="Red" />
                </Trigger>
                <Trigger TargetType="Picker" Property="SelectedIndex" Value="0">
                    <Setter Property="BackgroundColor" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
</TableView.Resources>

Upvotes: 1

SushiHangover
SushiHangover

Reputation: 74114

You can recursively descend through your top most Layout container that holds the Pickers and use some switch pattern matching to determine when to recurse into the next container.

public void CheckPickers(Layout layout)
{
    foreach (var child in layout.Children)
    {
        switch (child)
        {
            case Picker picker:
                if (picker.SelectedIndex <= 0)
                    picker.BackgroundColor = Color.Red;
                else
                    picker.BackgroundColor = Color.Green;
                break;
            case Layout l:
                CheckPickers(l);
                break;
            default:
                break;
        }
    }
}

Upvotes: 0

Related Questions