Поделиться через


Практическое руководство. Изменение цвета фона для строк в ListView

Обновлен: Ноябрь 2007

В данном примере показаны три метода, которые можно использовать для изменения цвета Background строк в ListView.

Пример

В следующих подразделах приведены три способа создания ListView со строками, различающимися по цвету Background. В примере также обсуждается метод обновления представления при добавлении или удалении строк.

Метод 1: определение стиля, использующего метод IValueConverter для изменения цвета фона

В следующем примере показано, как определить Style для элемента управления ListViewItem, который привязывает значение свойства Background к IValueConverter.

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

В следующем примере определяется ResourceKey для IValueConverter.

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

В следующем примере рассмотрено определение IValueConverter, устанавливающего свойство Background в зависимости от индекса строки.

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;
        }
    }

В следующем примере показано, как определить ListView, использующий Style как свойство ItemContainerStyle, чтобы предоставить требуемый макет.

<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>

Метод 2: создание нового класса, являющегося производным от ListView, для изменения цвета фона

В следующем примере показано, как определить класс, производный от ListView. Этот класс переопределяет метод PrepareContainerForItemOverride для создания строк, имеющих изменяющиеся Background цвета.

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;
            }
        }
    }
}

В следующем примере показано, как создать экземпляр этого класса. Префикс namespc соответствует пространству имен среда CLR (common language runtime) и соответствующей сборке, где определен StyleSelector.

<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>

Метод 3: использование StyleSelector для изменения цвета фона

В следующем примере показано, как определить StyleSelector, определяющий Style для строки. Этот пример определяет цвет Background согласно индексу строки.

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;
    }
}    

В следующем примере показано, как определить ResourceKey для StyleSelector. Префикс namespc соответствует пространству имен CLR и соответствующей сборке, где определен StyleSelector. Дополнительные сведения см. в разделе Пространства имен XAML и сопоставление пространств имен.

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

В следующем примере показано, как задать свойство ItemContainerStyleSelector для ListView его ресурсом StyleSelector.

<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>

Обновление ListView после изменения коллекции ListViewItem

Если из элемента управления ListView добавляются или удаляются ListViewItem, необходимо выполнить обновление элементов управления ListViewItem, чтобы заново отобразить измененный цвет Background. В следующем примере показано, как обновить элементы управления ListViewItem.

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

См. также

Основные понятия

Общие сведения об элементе управления ListView

Общие сведения о GridView

Ссылки

GridView

ListView

Другие ресурсы

Примеры использования ListView

Практические руководства, посвященные ListView