Практическое руководство. Изменение цвета фона для строк в 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