您好,
我刚接触WPF,最近在做一个项目,其中有个需求就是对一个ListView里的ListViewItem,根据它在整个Items集合里的位置,奇偶数位置设置不同的Background,比如奇数位置设置Background为Brushes.Transparent,偶数位置设置Background为Brushes.Gray.
而该ListView的数据源是绑定的:
private ObservableCollection<DataInfo> dataSource;
listView.ItemsSource = dataSource;ListView的XAML代码:
<ListView Name = "listView">
<ListView.View>
<GridView>
<GridViewColumn Header="确认状态" DisplayMemberBinding="{Binding State}"/>
<GridViewColumn Header="交易类型" DisplayMemberBinding="{Binding TradeType}"/>
<GridViewColumn Header="成交编号" DisplayMemberBinding="{Binding ID}"/>
<GridViewColumn Header="成交日期" DisplayMemberBinding="{Binding Date}"/>
<GridViewColumn Header="成交时间" DisplayMemberBinding="{Binding Time}"/>
<GridViewColumn Header="交易货币对" DisplayMemberBinding="{Binding CurrencyPair}"/>
<GridViewColumn Header="交易方向" DisplayMemberBinding="{Binding TradeDirection}"/>
<GridViewColumn Header="成交量" DisplayMemberBinding="{Binding Quantity}"/>
<GridViewColumn Header="成交价格" DisplayMemberBinding="{Binding Price}"/>
<GridViewColumn Header="对手方代码" DisplayMemberBinding="{Binding Code}"/>
</GridView>
</ListView.View>
</ListView>
请问如何设置这种背景颜色相间的Style?我尝试在ListView的ItemContainerStyle属性里设置,但未成功,请指教,谢谢
我刚接触WPF,最近在做一个项目,其中有个需求就是对一个ListView里的ListViewItem,根据它在整个Items集合里的位置,奇偶数位置设置不同的Background,比如奇数位置设置Background为Brushes.Transparent,偶数位置设置Background为Brushes.Gray.
而该ListView的数据源是绑定的:
private ObservableCollection<DataInfo> dataSource;
listView.ItemsSource = dataSource;ListView的XAML代码:
<ListView Name = "listView">
<ListView.View>
<GridView>
<GridViewColumn Header="确认状态" DisplayMemberBinding="{Binding State}"/>
<GridViewColumn Header="交易类型" DisplayMemberBinding="{Binding TradeType}"/>
<GridViewColumn Header="成交编号" DisplayMemberBinding="{Binding ID}"/>
<GridViewColumn Header="成交日期" DisplayMemberBinding="{Binding Date}"/>
<GridViewColumn Header="成交时间" DisplayMemberBinding="{Binding Time}"/>
<GridViewColumn Header="交易货币对" DisplayMemberBinding="{Binding CurrencyPair}"/>
<GridViewColumn Header="交易方向" DisplayMemberBinding="{Binding TradeDirection}"/>
<GridViewColumn Header="成交量" DisplayMemberBinding="{Binding Quantity}"/>
<GridViewColumn Header="成交价格" DisplayMemberBinding="{Binding Price}"/>
<GridViewColumn Header="对手方代码" DisplayMemberBinding="{Binding Code}"/>
</GridView>
</ListView.View>
</ListView>
请问如何设置这种背景颜色相间的Style?我尝试在ListView的ItemContainerStyle属性里设置,但未成功,请指教,谢谢
<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();