2011-10-19 8 views
1

J'ai une application de téléphone Silverlight que j'utilise pour apprendre. Il utilise des services Web pour obtenir les données. J'ai une grille avec une liste à l'intérieur de la grille. J'aimerais pouvoir avoir une partie du texte à l'intérieur de cette zone de liste, une certaine couleur en fonction des conditions.silverlight Grille ListBox ligne changer de couleur

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
     <ListBox x:Name="MainListBox" Margin="0,0,-12,0" SelectionChanged="MainListBox_SelectionChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Margin="0,0,0,17" Width="432"> 
         <TextBlock Text="{Binding Operation}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
         <TextBlock Text="{Binding Status}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
         <TextBlock Text="{Binding DateTimeStart1}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
         <TextBlock Text="{Binding DataID}" Visibility="Collapsed"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 

Donc, si le textblock qui est lié au statut .. si ce statut = true je veux changer la couleur de la ligne ou même juste que .... ce qui est textbox plus facile.

je suis liant les données en utilisant le code suivant

Me.MainListBox.ItemsSource = e.Result 

Toute aide serait grande

~~~~~~~~~~~~~~~~~~~~ ~~~~~~ Voici le code modifié

Private Class SomeData 
    Inherits wsData.Data_Queries 
    Public Property RowColor As SolidColorBrush 
End Class 

et voici où je crée une nouvelle instance de la classe et la liaison à la zone de liste

Dim oSomeDataS As New List(Of SomeData) 
    For Each x In e.Result 
     Dim oSomeData As New SomeData 
     With x 
      oSomeData.DataID = .DataID 
      oSomeData.DateTimeStart1 = .DateTimeStart1 
      oSomeData.FinishFromStart = .FinishFromStart 
      oSomeData.Operation = .Operation 
      oSomeData.ShortDate = .ShortDate 
      oSomeData.Status = .Status 
      oSomeData.TblComputerNameID = .TblComputerNameID 
      oSomeData.TblOperationID = .TblOperationID 
      oSomeData.TblStatusID = .TblStatusID 
      oSomeData.TblSiteID = .TblSiteID 

      If .Status = "False" Then 
       oSomeData.RowColor = New SolidColorBrush(Colors.Red) 
      Else 
       oSomeData.RowColor = New SolidColorBrush(Colors.Green) 
      End If 
      oSomeDataS.Add(oSomeData) 
     End With 
    Next 
    Me.MainListBox.ItemsSource = oSomeDataS.OrderBy(Function(o) o.Operation) 

Et le code XAML

<ListBox x:Name="MainListBox" Margin="0,0,-12,0" SelectionChanged="MainListBox_SelectionChanged"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Margin="0,0,0,17" Width="432"> 
         <TextBlock Text="{Binding Operation}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
         <TextBlock Text="{Binding Status}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}" Foreground="{Binding RowColor}"/> 
         <TextBlock Text="{Binding DateTimeStart1}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/> 
         <TextBlock Text="{Binding DataID}" Visibility="Collapsed"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

Répondre

0

Il y a beaucoup de différentes façons de le faire. Le plus simple à comprendre est d'utiliser un IValueConverter pour lier la couleur d'arrière-plan de la ligne à une couleur en fonction de l'état. Un bon exemple de ceci peut être trouvé here (l'exemple est WPF, mais le même principe s'applique dans Silverlight).

Une autre façon de procéder consiste à envelopper vos objets de données (provenant d'e.Result) dans un objet ViewModel. L'objet ViewModel exposerait toutes les mêmes propriétés que vos données, mais ajouterait également une propriété (peut-être RowColor) où le getter renvoyait un pinceau ou une couleur basé sur la valeur Status. Vous devez parcourir vos résultats électroniques et créer un nouveau ViewModel pour chacun, ajouter les ViewModels à une liste, puis définir la ItemsSource à cette nouvelle liste de ViewModels. Errrr .. J'ai essayé ce que vous avez suggéré.

+0

J'ai créé une classe qui a une propriété publique RowColor en tant que couleur. bouclé à travers et fait la propriété Color.Red et Color.Green basé sur le statut. dans le XAML a ajouté Foreground = "{Binding RowColor}". Quand je cours, cette ligne n'apparaît pas. Si je le change en avant-plan = "Rouge", cela se montre bien. La couleur n'est donc pas ce que je devrais utiliser pour la propriété RowColor – jvcoach23

+0

Avez-vous modifié votre ItemsSource pour en faire une collection de votre nouvelle classe? Pourriez-vous poster du code? –

+0

Ajouté le code dans une édition ci-dessus – jvcoach23

Questions connexes