2009-05-19 5 views
0

J'ai un ListView avec un GridView en elle:Programmatically changement individuel mise en page ListViewItem

<ListView x:Name="listViewPersons" ItemsSource="{Binding Path=Persons, Mode=OneWay}" IsSynchronizedWithCurrentItem="True" 
        Height="Auto" HorizontalAlignment="Stretch" Margin="4,4,4,4" Grid.Row="4" VerticalAlignment="Stretch" Width="Auto"> 
      <ListView.View> 
       <GridView x:Name="gridViewPersons"> 
        <GridViewColumn Header="Enabled"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <CheckBox HorizontalAlignment="Center" IsChecked="true" /> 
           </StackPanel> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}" Width="142" /> 
        <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Path=Age}" Width="142" /> 
        <GridViewColumn Header="Gender" DisplayMemberBinding="{Binding Path=Gender}" Width="142" /> 
       </GridView> 
      </ListView.View> 
     </ListView> 

Je veux être arrière-plans peuvent changer par programmation chacun des ListViewItem s (ou les lignes de la grille) ou avant-plans pour une couleur que je veux, par exemple

listViewPersons.Items[0].Background = Brush.Red; 
listViewPersons.Items[1].Background = Brush.Blue; 
listViewPersons.Items[2].Background = Brush.Green 

Je sais que les lignes précédentes de code ne fonctionnent pas, mais il explique à peu près ce que je veux atteindre. De l'aide?

Merci!

Répondre

2

Comment cette approche:

  1. Bind ForegroundColor et la couleur de fond à une propriété des personnes. Appelons cette propriété PersonStatus et définissons son type sur une énumération d'état, juste pour cet exemple.
  2. Assurez-vous que cette personne implémente INotifyPropertyChanged et que le setter de cette propriété déclenche un événement ProperyChanged. La propriété ressemblera à ceci:

    public Status PersonStatus 
    { 
        get 
        { 
         return status; 
        } 
        set 
        { 
         if (value != status) 
         { 
          status= value; 
          if (PropertyChanged != null) 
           PropertyChanged(this, new PropertyChangedEventArgs("PersonStatus")); 
         } 
        } 
    } 
    
  3. Créer un IValueConverter qui prend le type de statut et retourne un Brushes.Black, Brushes.Red, etc. Quelque chose comme ceci:

    public class StatusToColorConverter : IValueConverter 
    { 
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         if (targetType != typeof(Status)) 
          throw new InvalidOperationException("targetType must be Status"); 
    
         Status status = (Status)value; 
    
         switch (status) 
         { 
          case Status.New: 
           return Brushes.Black; 
          case Status.Professional: 
           return Brushes.Blue; 
          case Status.Delete: 
           return Brushes.Red; 
          default: 
           return Brushes.Black; 
         } 
        } 
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
        { 
         throw new NotImplementedException(); 
        } 
    }