2017-10-12 111 views
0

我目前正在使用Xamarin Forms创建一个跨平台的应用程序,并且我有几个选择器。我需要确保所有采购员都有一个选定的项目,如果不是,我想将他们的背景设置为红色。 我已经尝试循环到stacklayout的每个元素来选择所有的选择器,并检查他们选择的项目,但它不工作(这似乎是我的布局只有2个孩子,没有采摘)。我不知道如何用行为来做到这一点。确保使用Picker Xamarin Forms选择一个项目

我环路(在后面的代码)

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> 

...

+0

DiagHabitat只有2个直接的孩子,一个ProgressBar和一个表。为什么说明只需按名称检查每个选择器? – Jason

+0

谢谢你的回答。它只是代码的摘录,我有大约30个采集器,所以我正在寻找更优化的解决方案... –

回答

0

您可以通过递归的最顶端Layout容器下降持有的Picker S和使用一些开关模式匹配来确定何时递归到下一个容器。

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

谢谢!我使用你的代码,并更改我的xaml中的一些元素(基本上删除tablesection,只使用stacklayout),它工作正常。 –

1

您可以使用triggers,并使用隐式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> 
相关问题