zoukankan      html  css  js  c++  java
  • WPF中设置ListView的Items颜色交替显示

    2008/02/28 17:32

    i当ListView绑定数据源后,这个效果让我无从下手,

    这个问题一直困扰着我,后来我在CSDN上发贴求助,问题终于得以解决,这是一位大大给的回复:

    以下各节提供了三种方法,用于创建各行的 Background 颜色具有交替效果的 ListView。该示例还论述用于在添加或移除行时更新视图的方法。

    方法 1:定义使用 IValueConverter 来使背景色产生交替效果的样式

    下面的示例显示如何为将 Background 属性的值绑定到 IValueConverter 的 ListViewItem 控件定义 Style。

    XAML 复制代码
    <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。

    XAML 复制代码
    <namespc:BackgroundConverter x:Key="myConverter"/>




    下面的示例显示依据行索引设置 Background 属性的 IValueConverter 的定义。

    C# 复制代码
    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。

    XAML 复制代码
    <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 颜色的行。

    C# 复制代码
    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 的对应程序集。

    XAML 复制代码
    <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 颜色。

    C# 复制代码
    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 命名空间和命名空间映射。

    XAML 复制代码
    <namespc:ListViewItemStyleSelector x:Key="myStyleSelector"/>




    下面的示例演示如何将 ListView 的 ItemContainerStyleSelector 属性设置为此 StyleSelector 资源。

    XAML 复制代码
    <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 控件。

    C# 复制代码
    ICollectionView dataView =
    CollectionViewSource.GetDefaultView(theListView.ItemsSource);
    dataView.Refresh();

  • 相关阅读:
    faster-rcnn原理及相应概念解释
    caffe框架下目标检测——faster-rcnn实战篇操作
    caffe框架下目标检测——faster-rcnn实战篇问题集锦
    python的N个小功能(连接数据库并下载相应位置的图片)
    python的N个小功能(高斯模糊原理及实践)
    python的N个小功能(文本字段对应数值,经纬度计算距离,两个时间点计算时间间隔)
    python的N个小功能之正则匹配
    CSS注
    vue注
    在Vue项目中使用html2canvas生成页面截图并上传
  • 原文地址:https://www.cnblogs.com/seven_cheng/p/1735568.html
Copyright © 2011-2022 走看看