2017-06-22 49 views
0

一个有DataGridItemsSource集到DataTableAutoGenerateColumns="True"交替列背景动态列

<DataGrid ItemsSource="{Binding MyDataTable}" AutoGenerateColumns="True" /> 

我怎样才能使交替列背景呢?我看到的每个解决方案仅适用于静态列。

我不使用后面的代码,所以只有XAML解决方案才是首选,但我会很满意每一个有价值的答案。

+0

方不要e:为什么设置'DataContext'而不是'ItemsSource'? – grek40

+0

你说得对,我在事实上使用了'ItemsSource' :)我从错误的地方复制了代码(我也有从DataGrid派生的我自己的控件,我在那里使用'DataContext')。我编辑了这个问题。 – bpiec

回答

1

您可以将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> 

您可能想要利用透明背景,以便交替的行颜色和选择颜色仍然透过单元格颜色。

+0

'IndexToOddConverter'仅在Xceed Toolkit Plus中... – bpiec

+0

@bpiec我100%肯定我有免费版...但如前所述,它只是一个需要索引并返回布尔值的转换器...如果你没有预制品,你可以轻松写出你自己的作品。请注意,它是'http:// schemas.xceed.com/wpf/xaml/datagrid'名称空间的一部分,而不是'http:// schemas.xceed.com/wpf/xaml/toolkit'的一部分。 – grek40

+0

我将这个答案标记为自从它被首次接受并且真的有效。我创建了自己的'IndexToOddConverter',但可以使用@ mm8提供的解决方案。谢谢! – bpiec

1

创建您自己的转换器类:

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>