2010-03-23 5 views
0

J'ai une zone de liste de données qui affiche en réalité deux colonnes de données. Il est affiché comme suit:Comment pourrais-je faire cet affichage pour la liste?

<UserControl.Resources> 
     <DataTemplate x:Key="AlignedPairs"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*" /> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="10" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <TextBlock Text="{Binding Fruits}" Grid.Column="0" /> 
       <TextBlock Text="->" TextAlignment="Center" Grid.Column="1" /> 
       <TextBlock Text="{Binding Colors}" Grid.Column="3" /> 
      </Grid> 
     </DataTemplate> 
    </UserControl.Resources> 

      <ListBox Name="lbStuff" Grid.ColumnSpan="2" Grid.Row="1" 
        ItemTemplate="{StaticResource AlignedPairs}"> 
       <ListBox.ItemContainerStyle> 
        <Style TargetType="ListBoxItem"> 
         <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
        </Style> 
       </ListBox.ItemContainerStyle> 
      </ListBox> 

Puis Itemsource défini dans codebehind.

Selon une certaine logique cependant, je voudrais définir soit une ligne ou un élément dans l'une des colonnes, par exemple. un fruit au rouge, ou la ligne à gras. J'ai le code pour déterminer quel fruit ou couleur je voudrais différencier (par couleur/gras) dans le code derrière, mais je ne peux pas comprendre, particulièrement donné l'affichage de liste de liste personnalisé, comment je pourrais aller au sujet d'un article particulier à une couleur différente/gras.

Quelqu'un a-t-il des idées? Faites-moi savoir si d'autres codes sont requis.

À votre santé. Tout ce que je veux vraiment faire est de rendre le problème aussi facile que possible ... faire une boucle sur chaque élément de la liste et vérifier avec une chaîne, s'il y a une correspondance SOMEHOW distinguer visuellement ce item dans la listbox/listview. Il n'est pas nécessaire de rendre cela plus compliqué que nécessaire. Pourquoi vous n'êtes pas en mesure de définir individuellement une couleur de premier plan éléments est au-delà de moi!

modifier 2:

On dirait que je presque y arriver avec les éléments suivants (mais il émet une exception et ne fonctionne pas) se chargeront de cette

  foreach (var li in ListView.Items) 
      { 

       if (someCriteria == true) 
       { 
         ((ListViewItem) li).Foreground = Brushes.Red; 
//exception throw as this is the actual object stored in this location (the Fruit object for example) not the row or listviewitem I want to change the color of so it can't be cast :(
       } 
      } 
+0

Comment vos données sont modélisés - est une chaîne Fruits, un objet de fruits ou une collection? Quelles informations contrôlent l'affichage, par ex. avez-vous une propriété IsPrizeWinningFruit que vous voulez afficher en gras, ou avez-vous besoin de baser sur le nom, ou quoi? – itowlson

+0

Fruit et Couleur sont tous deux des objets par exemple, avec des propriétés Nom et Code. Cet écran affiche une relation entre les deux (Fruit & Color). Il y a trois fichiers texte fruit.txt, color.txt et relationship.txt. L'application a trois écrans - fruit, couleur et relation. Frut peut ajouter des fruits supprimés. Couleur ajouter supprimer les couleurs. Relation - peut rapporter les deux. Essayer de montrer dans cet écran deux choses - si un fruit est dans la relation mais manquant de fruit.txt, et inversement, si le fruit est dans fruit.txt mais pas dans relationship.txt. Je montre déjà le deuxième exemple avec une autre liste. – baron

Répondre

1

C'est ici que le motif de conception ViewModel vous aide vraiment. Vous avez probablement une classe qui expose les propriétés Fruit et Color. Créez une classe wrapper qui expose ces deux propriétés et expose, par exemple, FruitBackgroundBrush et ItemBackgroundBrush. Ensuite, vous pouvez simplement lier à ces propriétés dans votre modèle, .: par exemple

<DataTemplate x:Key="AlignedPairs"> 
    <Grid Background={Binding ItemBackgroundBrush}> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition Width="10" /> 
      <ColumnDefinition Width="*" /> 
     </Grid.ColumnDefinitions> 
     <TextBlock Text="{Binding Fruits}" 
        Background="{Binding FruitBackgroundBrush}" 
        Grid.Column="0" /> 
     <TextBlock Text="->" TextAlignment="Center" Grid.Column="1" /> 
     <TextBlock Text="{Binding Colors}" Grid.Column="3" /> 
    </Grid> 
</DataTemplate> 
+0

Ah génial! Je suis toujours en train de me concentrer sur la liaison de données et cela a rendu les choses si faciles. C'est la solution parfaite et cela m'aide vraiment à comprendre la puissance de la liaison de données. Merci beaucoup! – baron

0
+0

Serai-je en mesure de définir une ligne, ou un élément de cette rangée, la couleur ou la propriété en gras? Il semble que la plupart des choses que je google disent que vous ne pouvez définir que la police, le premier plan, les propriétés en gras, etc. – baron

+0

Aussi cet exemple ne convient pas -> plutôt qu'un X ou O, j'ai une liste potentielle des noms de chaînes pour vérifier chaque valeur – baron

Questions connexes