2015-05-07 10 views
6

Ho visto alcune risposte prima ma nulla mi ha davvero aiutato.Imposta il colore di sfondo in base al valore con associazione a dati

Ho anche una classe di DecideModel (Questo sarà un set di dati recuperati da DB, ma per scopo di questa domanda, ho aggiunto un ObservableCollection) che contiene

static DecideModel() 
    { 
     All = new ObservableCollection<DecideModel> 
     { 
      new DecideModel 
      { 
       DatePerformed = new DateTime(2015, 4, 06), 
       Result = "Maybe" 
      }, 
      new DecideModel 
      { 
       DatePerformed = new DateTime(2015, 4, 05), 
       Result = "No" 
      }, 
      new DecideModel 
      { 
       DatePerformed = new DateTime(2015, 4, 04), 
       Result = "Yes" 
      } 
     }; 
    } 

    public DateTime DatePerformed { set; get; } 

    public string Result { set; get; } 

    public static IList<DecideModel> All { set; get; } 
} 

Nel mio codice XAML ho

<ContentPage.Resources> 
    <ResourceDictionary> 
     <Color x:Key="Maybe">#ffddbc21</Color> 
     <Color x:Key="Yes">#3CB371</Color> 
     <Color x:Key="No">#B22222</Color> 
     <Color x:Key="Depends">#ffd78800</Color> 
    </ResourceDictionary> 
</ContentPage.Resources> 

<Label Text="{Binding Result}" HorizontalOptions="FillAndExpand" BackgroundColor="{StaticResource {BindingSource Result}}" /> 

Sto provando a impostare dinamicamente il colore di sfondo dell'etichetta rispetto al risultato che ho ottenuto dall'oggetto.

Per favore fatemi sapere se avete qualche idea su come farlo. Sto cercando qualsiasi opzione utile disponibile.

risposta

10

Quello che probabilmente serve è un ValueConverter. Quello che stai facendo ora è impostare il colore di sfondo su "Forse", "No" o "Sì", che chiaramente non è un colore.

Quello che devi fare è convertire quel valore in un colore. Puoi farlo in questo modo.

Creare una nuova classe che implementa l'interfaccia IValueConverter. Sarà probabilmente simile a questa:

public class YesNoMaybeToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
      switch(value.ToString().ToLower()) 
      { 
        case "yes": 
         return Color.Green; 
        case "no": 
         return Color.Red; 
        case "maybe": 
         return Color.Orange; 
      } 

      return Color.Gray; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
      // You probably don't need this, this is used to convert the other way around 
      // so from color to yes no or maybe 
      throw new NotImplementedException(); 
    } 
} 

Quindi aggiungere questa classe come una risorsa statica alla tua pagina XAML come questo:

<ContentPage.Resources> 
    <!-- Add this line below --> 
    <local:YesNoToBooleanConverter x:Key="YesNoMaybeToColorConverter" /> 
    <!-- You can remove the underneath --> 
    <!--<ResourceDictionary> 
     <Color x:Key="Maybe">#ffddbc21</Color> 
     <Color x:Key="Yes">#3CB371</Color> 
     <Color x:Key="No">#B22222</Color> 
     <Color x:Key="Depends">#ffd78800</Color> 
    </ResourceDictionary>--> 
</ContentPage.Resources> 

Ora nel tuo legame Devi dirgli cosa convertitore da utilizzare . Fare in questo modo:

<Label Text="{Binding Result}" HorizontalOptions="FillAndExpand" BackgroundColor="{Binding Result, Converter={StaticResource YesNoMaybeToColorConverter}}" /> 

Ora dovrebbe vedere il valore nel campo Result, metterlo attraverso il convertitore è stato definito e restituire il colore che si corrispondeva a quel valore.

+0

Grazie per quello! – rkc88