Mark 一下
http://msdn.microsoft.com/zh-cn/library/ms750769(v=vs.90).aspx
如何:改变 ListView 中各行的背景色
更新:2007 年 11 月
此示例演示您可用于使 ListView 中各行的 Background 颜色产生交替效果的三种方法。
以下各节提供了三种方法,用于创建各行的 Background 颜色具有交替效果的 ListView。该示例还论述用于在添加或移除行时更新视图的方法。
方法 1:定义使用 IValueConverter 来使背景色产生交替效果的样式
下面的示例显示如何为将 Background 属性的值绑定到 IValueConverter 的 ListViewItem 控件定义 Style。
<Style x:Key="myItemStyle" TargetType="{x:Type ListViewItem}"> <Setter Property="Background"> <Setter.Value> <Binding RelativeSource="{RelativeSource Self}" Converter="{StaticResource myConverter}"/> </Setter.Value> </Setter> </Style>
下面的示例为 IValueConverter 定义 ResourceKey。
<namespc:BackgroundConverter x:Key="myConverter"/>
下面的示例显示依据行索引设置 Background 属性的 IValueConverter 的定义。
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; } }
下面的示例演示如何定义使用 Style 作为其 ItemContainerStyle 以便提供所需布局的 ListView。
<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) 命名空间和其中定义了 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 使背景色产生交替效果
下面的示例演示如何定义一个为行定义 Style 的 StyleSelector。此示例依据行索引定义 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; } }
下面的示例演示如何为 StyleSelector 定义 ResourceKey。namespc 前缀映射到 CLR 命名空间和其中定义了 StyleSelector 的对应程序集。有关更多信息,请参见 XAML 命名空间和命名空间映射。
<namespc:ListViewItemStyleSelector x:Key="myStyleSelector"/>
下面的示例演示如何将 ListView 的 ItemContainerStyleSelector 属性设置为此 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>
在 ListViewItem 集合中进行更改后更新 ListView
如果从 ListView 控件中添加或移除 ListViewItem,您必须更新 ListViewItem 控件以便重新创建交替的 Background 颜色。下面的示例演示如何更新ListViewItem 控件。
ICollectionView dataView =
CollectionViewSource.GetDefaultView(theListView.ItemsSource);
dataView.Refresh();