2012-02-17 3 views
0

J'ai une liste d'objets et un ListView où j'affiche cette liste. Un tel objet a des propriétés, elles sont liées aux colonnes de ListView.Modifier la couleur de premier plan d'un élément ListView seulement dans une colonne

<ListView x:Name="_fileNameList" FontSize="12" SourceUpdated="_fileNameList_SourceUpdated" TargetUpdated="_fileNameList_TargetUpdated"> 
    <ListView.View> 
     <GridView x:Name="FileNameAttributes" > 
      <GridViewColumn Header="File Name" Width="200" DisplayMemberBinding="{Binding fileName}"/> 
      <GridViewColumn Header="Size" Width="80" DisplayMemberBinding="{Binding size}"/> 
      <GridViewColumn Header="Date" Width="80" DisplayMemberBinding="{Binding date}"/> 
      <GridViewColumn Header="Time" Width="80" DisplayMemberBinding="{Binding time}"/> 
      <GridViewColumn Header="New Name" Width="300" DisplayMemberBinding="{Binding newFileName}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

Cette partie fonctionne correctement.

Maintenant, je veux changer la couleur de premier plan de la colonne newFileName dans une seule rangée, mais seulement si elle est égale à la 'fileName' dans la même rangée. Est-ce que je peux le faire en XAML ou dois-je aller au code derrière le fichier? Je préférerais pouvoir le gérer en XAML, parce que je pense que c'est un problème de pure conception, mais je ne sais pas par où commencer ou où mettre cela, (puis-je faire des comparaisons de chaînes en XAML? J'ai donc essayé de gérer cela dans le code derrière le fichier. Je pensais qu'il devait y avoir un événement qui est levé quand le ListView a changé, j'ai essayé l'événement SourceUpdated, mais il n'est pas entré quand je change le contenu de ma liste. Le prochain problème serait, comment accéder à ces éléments ListView ...

Quelqu'un peut-il me donner une idée de comment je peux résoudre ce problème?

+1

Je ne l'ai jamais fait moi-même, mais vous pouvez essayer de créer un convertisseur personnalisé (comme ceux pour la visibilité) et lier la propriété Foreground à ce convertisseur. – mslliviu

Répondre

2

Vous pouvez le faire en utilisant MultiBinding et MultiConverter. Vous devrez écrire un MultiConverter qui prend et fileName NewFileName et retourne vrai si elles sont égales

<ListView x:Name="_fileNameList" FontSize="12" SourceUpdated="_fileNameList_SourceUpdated" TargetUpdated="_fileNameList_TargetUpdated"> 
      <ListView.View> 
       <GridView x:Name="FileNameAttributes" > 
        <GridViewColumn Header="File Name" Width="200" DisplayMemberBinding="{Binding fileName}"/> 
        <GridViewColumn Header="Size" Width="80" DisplayMemberBinding="{Binding size}"/> 
        <GridViewColumn Header="Date" Width="80" DisplayMemberBinding="{Binding date}"/> 
        <GridViewColumn Header="Time" Width="80" DisplayMemberBinding="{Binding time}"/> 
        <GridViewColumn Header="New Name" Width="300"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding newFileName}"> 
            <TextBlock.Style> 
             <Style> 
              <Setter Property="TextBlock.Foreground" Value="Black"></Setter> 
              <Style.Triggers> 
               <DataTrigger Value="True"> 
                <DataTrigger.Binding> 
                 <MultiBinding Converter="{StaticResource EqualityConverter}"> 
                  <Binding Path="newFileName"></Binding> 
                  <Binding Path="fileName"></Binding> 
                 </MultiBinding> 
                </DataTrigger.Binding> 
             <Setter Property="TextBlock.Foreground" Value="Red"></Setter> 
            </DataTrigger> 
              </Style.Triggers> 
             </Style> 
            </TextBlock.Style> 
           </TextBlock> 

          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 

Le code pour EqualityConverter est comme ci-dessous:

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (values[0].ToString().Equals(values[1].ToString())) 
       return true; 
      return false; 
     } 
+0

Merci, j'ai créé la classe MultiConverter dans le code derrière le fichier, mais quand j'essaie de le référencer dans la section ressources, j'obtiens une erreur "type was not found", comment dois-je le référencer? – stema

+0

Merci beaucoup, je l'ai eu à travailler (avait la classe MultiConverter au mauvais endroit).Fonctionne merveilleusement bien. – stema

2

Si vous souhaitez modifier le style d'un élément wpf, vous devez utiliser le style. Si vous voulez que cela arrive dans certaines conditions, utilisez Style.Triggers. Si vos conditions appartiennent à des informations contraignantes, vous devez utiliser DataTrigger. Et si le Datatrigger XAML ne peut pas gérer votre condition, ajoutez un convertisseur. Donc je vous suggère de prendre un datatrigger dans votre GridViewColum.Style et un multiconvertisseur avec 2 paramètres filename et newfilename. retourner vrai si c'est le même sinon faux.

quelque chose comme ça:

<DataTrigger Value="True"> 
    <DataTrigger.Binding> 
    <MultiBinding Converter="{StaticResource MyFileNameCheckConverter}"> 
     <Binding Path="fileName"/> 
     <Binding Path="newFileName"/> 
    </MultiBinding> 
    </DataTrigger.Binding> 
    <Setter Property="Foreground" Value="Red"/> 
</DataTrigger> 

Convertisseur

public class FileNameCheckConverter: IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     var filename = (string)values[0]; 
     var newfilename = (string)values[1]; 

     return filename==newfilename; 
    } 

    ... 
} 

ps: ne pas oublier de mettre au premier plan "normal" dans votre style aussi! sinon, le déclencheur ne fonctionnera pas.

pps: le code est écrit à la main

+0

Addition: Change CellTemplate de la colonne particulière car GridViewColumn n'est pas un élément de structure. – sanguine

+0

Merci (+1) vous m'avez donné aussi des conseils importants pour le faire fonctionner. – stema

Questions connexes