2017-04-18 7 views
1

Ich habe einige Antworten überprüft, aber nichts hat mir geholfen. Ich versuche, die Hintergrundfarbe von ViewCell in ListView zu ändern, indem ich StackLayout BackgroundColor verbinde. Für jetzt sieht es so aus enter image description hereBinding Farbe in Xamarin listView

Jede Zelle sollte mit anderen Farben gefüllt werden, aber es ändert sich überhaupt nicht. Code dahinter:

OrderDatapage.XAML:

<ContentPage.Resources> 
    <ResourceDictionary> 
     <local:BackgroundConverter x:Key="BackgroundConverter" /> 
    </ResourceDictionary> 
</ContentPage.Resources> 
. 
. 
. 
. 
<StackLayout Orientation="Vertical"> 
     <ListView x:Name="timetableList" 
         RowHeight="25" 
         SeparatorVisibility="Default" 
         Margin="0,0,0,10" 
         > 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <ViewCell> 
          <StackLayout Orientation="Horizontal" 
             VerticalOptions="FillAndExpand" 
             BackgroundColor="{Binding Paint, Converter={StaticResource BackgroundConverter}}"> 
             <Label Text="{Binding Number}" 
               FontSize="Medium" 
               Margin="20,0,0,0" 
               TextColor="White" 
               BackgroundColor="Black" 
               /> 
             <Label Text="{Binding Title}" 
               FontSize="Default" 
               Margin="20,0,0,0" 
               TextColor="Black" 
               /> 
             <Label Text="{Binding Date}" 
               FontSize="Default" 
               HorizontalOptions="EndAndExpand" 
               Margin="0,0,40,0" 
               TextColor="Black" 
               /> 
          </StackLayout> 
         </ViewCell> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 

Converter.cs

class BackgroundConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Color.FromHex(value.ToString()); 
    } 
} 

OrderDataPage.cs

List<TimetableItem> timeTableList { get; set; } 
    public OrderDataPage() 
    { 
     InitializeComponent(); 
     timeTableList = new List<TimetableItem>(); 
     var timetable1 = new TimetableItem() { Number = "1", Title = "Test1", Date = "20-12-2020", Paint = "#63FF20" }; 
     var timetable2 = new TimetableItem() { Number = "2", Title = "Test2", Date = "20-12-2020", Paint = "#FFD933" }; 
     var timetable3 = new TimetableItem() { Number = "3", Title = "Test3", Date = "20-12-2020", Paint = "#C0C0C0" }; 
     timeTableList.Add(timetable1); 
     timeTableList.Add(timetable2); 
     timeTableList.Add(timetable3); 

     timetableList.ItemsSource = timeTableList; 

    } 
+0

Ihr finden Code sieht gut aus, haben Sie mit Breakpoints überprüft Value Convert wird aufgerufen? – Dilmah

Antwort

3

Ich denke, Sie sollten Aufklebers BACKGROUND zu "setzen versuchen Transparent ", um die Hintergrundfarbe von StackLayout zu sehen, aber ich bin mir nicht sicher, ob es funktioniert. Andernfalls können Sie Label BackGroundColor auf eine bestimmte Farbe einstellen.

In Ihrem IValueConverter sollten Sie überprüfen, ob "Wert" nicht null ist

if(value != null && value is string && (string)value != "") 
    return Color.FromHex(value.ToString()); 
else 
    return Color.Red; 

UPDATE

Ich habe einen kleinen Test gemacht die BackgroudColor der StackLayout Einstellung

slView.SetBinding(StackLayout.BackgroundColorProperty, "BackgroundColor"); 

Wo Background a Zeichenkette

List.Add(new Model { Description = "D1", Cost = 10.0, Qty = 1, BackgroundColor = "#9ac16e"}); 
List.Add(new Model { Description = "D2", Cost = 20.0, Qty = 2, BackgroundColor = "#8d0000" }); 
List.Add(new Model { Description = "D3", Cost = 30.0, Qty = 3, BackgroundColor = "#3a6cf6"}); 

Und es funktioniert auch ohne IValueConverter

iOS

Android

Das einzige Problem ist, dass Sie verlieren dann Markieren Sie, wenn Sie die Zeile

wählen können Sie ein Repo HERE

+0

Die Einstellung von BackGroundColor auf "Transparent" war eine gute Idee für mich. Vielen Dank! – user2999425