一个有DataGrid
与ItemsSource
集到DataTable
与AutoGenerateColumns="True"
:交替列背景动态列
<DataGrid ItemsSource="{Binding MyDataTable}" AutoGenerateColumns="True" />
我怎样才能使交替列背景呢?我看到的每个解决方案仅适用于静态列。
我不使用后面的代码,所以只有XAML解决方案才是首选,但我会很满意每一个有价值的答案。
一个有DataGrid
与ItemsSource
集到DataTable
与AutoGenerateColumns="True"
:交替列背景动态列
<DataGrid ItemsSource="{Binding MyDataTable}" AutoGenerateColumns="True" />
我怎样才能使交替列背景呢?我看到的每个解决方案仅适用于静态列。
我不使用后面的代码,所以只有XAML解决方案才是首选,但我会很满意每一个有价值的答案。
您可以将DataGridCell.Column.DisplayIndex
转换为布尔值,它在奇数和偶数列索引之间交替。
我在这里利用扩展WPF工具包中的转换器,但它应该很容易写出你自己的。
<xcdg:IndexToOddConverter x:Key="oddConverter"/>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Column.DisplayIndex,RelativeSource={RelativeSource Self},Converter={StaticResource oddConverter}}" Value="True">
<Setter Property="Background" Value="{StaticResource AlternatingColumnBackgroundBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>
您可能想要利用透明背景,以便交替的行颜色和选择颜色仍然透过单元格颜色。
'IndexToOddConverter'仅在Xceed Toolkit Plus中... – bpiec
@bpiec我100%肯定我有免费版...但如前所述,它只是一个需要索引并返回布尔值的转换器...如果你没有预制品,你可以轻松写出你自己的作品。请注意,它是'http:// schemas.xceed.com/wpf/xaml/datagrid'名称空间的一部分,而不是'http:// schemas.xceed.com/wpf/xaml/toolkit'的一部分。 – grek40
我将这个答案标记为自从它被首次接受并且真的有效。我创建了自己的'IndexToOddConverter',但可以使用@ mm8提供的解决方案。谢谢! – bpiec
创建您自己的转换器类:
public class OddConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return Binding.DoNothing;
return (int)value % 2 != 0;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
<DataGrid ItemsSource="{Binding MyDataTable}" AutoGenerateColumns="True" />
<DataGrid.Resources>
<local:OddConverter x:Key="oddConverter" />
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Column.DisplayIndex,RelativeSource={RelativeSource Self},Converter={StaticResource oddConverter}}" Value="True">
<Setter Property="Background" Value="Silver"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
</DataGrid>
或者你也可以处理AutoGeneratingColumn
事件:
int index = 0;
private void dgrData_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (index++ % 2 != 0)
{
e.Column.CellStyle = dgrData.Resources["oddCellStyle"] as Style;
}
}
<DataGrid Name="dgrData" ItemsSource="{Binding MyDataTable}" AutoGeneratingColumn="dgrData_AutoGeneratingColumn" />
<DataGrid.Resources>
<Style x:Key="oddCellStyle" TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="Silver"/>
</Style>
</DataGrid.Resources>
</DataGrid>
方不要e:为什么设置'DataContext'而不是'ItemsSource'? – grek40
你说得对,我在事实上使用了'ItemsSource' :)我从错误的地方复制了代码(我也有从DataGrid派生的我自己的控件,我在那里使用'DataContext')。我编辑了这个问题。 – bpiec