2015-05-07 26 views
6

Widziałem wcześniej kilka odpowiedzi, ale nic tak naprawdę mi nie pomogło.Ustaw kolor tła w zależności od wartości powiązanej z danymi

Mam też klasa DecideModel (będzie to zbiór danych pobierane z DB, ale dla celów tego pytania, dodałem ObservableCollection), który zawiera

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

W moim kodu XAML mam

<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}}" /> 

Próbuję dynamicznie ustawić kolor tła etykiety w odniesieniu do wyniku uzyskanego z Obiektu.

Proszę dać mi znać, jeśli masz pojęcie, jak to zrobić. Szukam jakiejkolwiek użytecznej dostępnej opcji.

Odpowiedz

10

To, czego prawdopodobnie potrzebujesz, to ValueConverter. To, co teraz robisz, ustawia kolor tła na "Być może", "Nie" lub "Tak", co wyraźnie nie jest kolorem.

To, co musisz zrobić, to przekonwertować tę wartość na kolor. Możesz to zrobić w ten sposób. Wygeneruj nową klasę implementującą interfejs IValueConverter. Będzie to prawdopodobnie wyglądać następująco:

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(); 
    } 
} 

następnie dodać do tej klasy jako zasób statycznych do strony XAML tak:

<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> 

teraz w Twoich wiązania trzeba powiedzieć mu, co konwerter używać . Czy to tak:

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

Należy teraz zobaczyć wartość w polu Result, umieścić go przez konwerter zdefiniowanego i przywrócić kolor, który odpowiadał do tej wartości.

+0

Dzięki za to! – rkc88

Powiązane problemy