Freigeben über


Gewusst wie: Ändern der Hintergrundfarbe von Zeilen in einem ListView-Steuerelement

Aktualisiert: November 2007

In diesem Beispiel werden drei Methoden erläutert, die Sie verwenden können, um die Background-Farbe von Zeilen in einer ListView zu ändern.

Beispiel

In den folgenden Abschnitte finden Sie drei Methoden, um eine ListView mit Zeilen zu erstellen, die über verschiedene Background-Farben verfügen. Im Beispiel wird auch eine Methode zum Aktualisieren der Ansicht beim Hinzufügen oder Entfernen von Zeilen erläutert.

Methode 1: Festlegen eines Stils, in dem ein IValueConverter zum Ändern der Hintergrundfarbe verwendet wird

Im folgenden Beispiel wird erläutert, wie ein Style für ein ListViewItem-Steuerelement festgelegt wird, von dem der Wert der Background-Eigenschaft an einen IValueConverter gebunden wird.

<Style x:Key="myItemStyle" TargetType="{x:Type ListViewItem}">
  <Setter Property="Background">
    <Setter.Value>
      <Binding RelativeSource="{RelativeSource Self}" 
               Converter="{StaticResource myConverter}"/>
    </Setter.Value>
  </Setter>
</Style>

Im folgenden Beispiel wird ein ResourceKey für den IValueConverter festgelegt.

<namespc:BackgroundConverter x:Key="myConverter"/>

Im folgenden Beispiel ist die Definition des IValueConverter dargestellt, von dem die Background-Eigenschaft entsprechend dem Zeilenindex festgelegt wird.

public sealed class BackgroundConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
        CultureInfo culture)
    {
        ListViewItem item = (ListViewItem)value;
        ListView listView = 
            ItemsControl.ItemsControlFromItemContainer(item) as ListView;
        // Get the index of a ListViewItem
        int index = 
            listView.ItemContainerGenerator.IndexFromContainer(item);

        if (index % 2 == 0)
        {
            return Brushes.LightBlue;
        }
        else
        {
            return Brushes.Beige;
        }
    }

Im folgenden Beispiel wird dargestellt, wie ein ListView festgelegt wird, von dem ein Style als ItemContainerStyle zur Bereitstellung des gewünschten Layouts verwendet wird.

<ListView Name="theListView" 
          ItemsSource="{Binding Source={StaticResource EmployeeData}, 
                                        XPath=Employee}"
          ItemContainerStyle="{StaticResource myItemStyle}" >
  <ListView.View>
    <GridView>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=FirstName}" 
                      Header="First Name" Width="120"/>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=LastName}" 
                      Header="Last Name" Width="120"/>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=FavoriteCity}" 
                      Header="Favorite City" Width="120"/>
    </GridView>
  </ListView.View>
</ListView>

Methode 2: Ableiten einer neuen Klasse von ListView zum Ändern der Hintergrundfarbe

Im folgenden Beispiel wird dargestellt, wie eine Klasse definiert wird, die von ListView abgeleitet ist. Von dieser Klasse wird die PrepareContainerForItemOverride-Methode überschrieben, um Zeilen zu erstellen, die über unterschiedliche Background-Farben verfügen.

public class SubListView : ListView
{
    protected override void
        PrepareContainerForItemOverride(DependencyObject element,
        object item)
    {
        base.PrepareContainerForItemOverride(element, item);
        if (View is GridView)
        {
            int index = ItemContainerGenerator.IndexFromContainer(element);
            ListViewItem lvi = element as ListViewItem;
            if (index % 2 == 0)
            {
                lvi.Background = Brushes.LightBlue;
            }
            else
            {
                lvi.Background = Brushes.Beige;
            }
        }
    }
}

Im folgenden Beispiel wird veranschaulicht, wie eine Instanz dieser Klasse erstellt wird. Das namespc-Präfix wird einem common language runtime (CLR)-Namespace und der entsprechenden Assembly zugeordnet, in der der StyleSelector definiert wird.

<namespc:SubListView
      ItemsSource="{Binding Source={StaticResource EmployeeData}, 
                                        XPath=Employee}">
  <namespc:SubListView.View>
    <GridView>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=FirstName}" 
                      Header="First Name" Width="120"/>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=LastName}" 
                      Header="Last Name" Width="120"/>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=FavoriteCity}" 
                      Header="Favorite City" Width="120"/>
    </GridView>
  </namespc:SubListView.View>
</namespc:SubListView>

Methode 3: Verwenden eines StyleSelector zum Ändern der Hintergrundfarbe

Im folgenden Beispiel wird dargestellt, wie ein StyleSelector festgelegt wird, von dem ein Style für eine Zeile definiert wird. In diesem Beispiel wird die Background-Farbe entsprechend des Zeilenindex definiert.

public class ListViewItemStyleSelector : StyleSelector
{
    public override Style SelectStyle(object item, 
        DependencyObject container)
    {
        Style st = new Style();
        st.TargetType = typeof(ListViewItem);
        Setter backGroundSetter = new Setter();
        backGroundSetter.Property = ListViewItem.BackgroundProperty;
        ListView listView = 
            ItemsControl.ItemsControlFromItemContainer(container) 
              as ListView;
        int index = 
            listView.ItemContainerGenerator.IndexFromContainer(container);
        if (index % 2 == 0)
        {
            backGroundSetter.Value = Brushes.LightBlue;
        }
        else
        {
            backGroundSetter.Value = Brushes.Beige;
        }
        st.Setters.Add(backGroundSetter);
        return st;
    }
}    

Im folgenden Beispiel wird dargestellt, wie ein ResourceKey für den StyleSelector festgelegt wird. Das namespc-Präfix wird einem CLR-Namespace und der entsprechenden Assembly zugeordnet, in der der StyleSelector definiert wird. Weitere Informationen finden Sie unter XAML-Namespaces und Namespacezuordnung.

<namespc:ListViewItemStyleSelector x:Key="myStyleSelector"/>

Im folgenden Beispiel wird dargestellt, wie die ItemContainerStyleSelector-Eigenschaft der ListView für diese StyleSelector-Ressource festgelegt wird.

<ListView 
      ItemsSource="{Binding Source={StaticResource EmployeeData}, 
                                        XPath=Employee}"
      ItemContainerStyleSelector="{DynamicResource myStyleSelector}" >      
  <ListView.View>
    <GridView>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=FirstName}" 
                      Header="First Name" Width="120"/>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=LastName}" 
                      Header="Last Name" Width="120"/>
      <GridViewColumn DisplayMemberBinding="{Binding XPath=FavoriteCity}" 
                      Header="Favorite City" Width="120"/>
    </GridView>
  </ListView.View>
</ListView>

Aktualisieren der ListView nach einer Änderung in der ListViewItem-Auflistung

Wenn Sie ein ListViewItem entfernen bzw. dem ListView-Steuerelement hinzufügen, müssen Sie die ListViewItem-Steuerelemente aktualisieren, um die zu ändernde Background-Farbe neu zu erstellen. Das folgende Beispiel veranschaulicht, wie die ListViewItem-Steuerelemente aktualisiert werden.

ICollectionView dataView =
  CollectionViewSource.GetDefaultView(theListView.ItemsSource);
dataView.Refresh();

Siehe auch

Konzepte

Übersicht über ListView

Übersicht über GridView

Referenz

GridView

ListView

Weitere Ressourcen

ListView-Beispiele

Gewusst-wie-Themen zu ListView