2011-09-13 74 views
0

我想出了如何突出显示感兴趣的行。我可以获得我感兴趣的列的索引,并使用ScrollIntoView来跳转到它。但是,它不会立即弹出给用户。我想突出显示该列,或者更改ColumnHeaderStyle。我似乎无法弄清楚如何在xaml或代码背后做到这一点。根据datagrid中的选择更改ColumnHeaderStyle的背景颜色

另一种替代方法是不突出显示整行和列标题,而只是显示感兴趣的单元格。我宁愿那样做,但无法弄清楚。

我目前的DataGrid是这样的:

<DataGrid x:Name="dtGridReads" AutoGenerateColumns="False" 
      VirtualizingStackPanel.IsVirtualizing="True"          
      VirtualizingStackPanel.VirtualizationMode ="Standard" 
       EnableColumnVirtualization="True" 
       EnableRowVirtualization="True" 
      ScrollViewer.IsDeferredScrollingEnabled="True" 
      CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="True" 
      ItemsSource ="{Binding}" Block.TextAlignment="Center" 
      AlternatingRowBackground="#F1F1F1" RowBackground="White" 
       CanUserAddRows="False" CanUserDeleteRows="False" FrozenColumnCount="1" 
       GridLinesVisibility="None"     ScrollViewer.ScrollChanged="dtGridReads_ScrollChanged"> 

    <DataGrid.CellStyle> 
     <Style TargetType="{x:Type DataGridCell}"> 
      <Style.Triggers> 
       <Trigger Property="DataGridCell.IsSelected" Value="True"> 
        <Setter Property="Background" Value="red" /> 
        <Setter Property="BorderThickness" Value="0" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.CellStyle> 

我后面的代码:

public void ShowSelectedCell(int row, int column) 
    { 
     //dtGridReads.SelectedItem = dtGridReads.Items[row]; 
     //dtGridReads.SelectedItem = dtGridReads.Columns[column]; 
     //dtGridReads.CurrentColumn = dtGridReads.Columns[column]; 
     dtGridReads.ScrollIntoView(dtGridReads.Items[row], dtGridReads.Columns[column]); 

    } 

感谢。

+0

更改'DataGridColumnHeader'的''背景'是非常有用的,因为您需要重新构建样式。不知道这是你想要的,但你有没有尝试在'DataGrid'上设置'SelectionUnit =“CellOrRowHeader”'? –

+0

@Meleak,我将使用什么触发器来选择列? – Crystal

+0

不知道我是否正确理解你的问题,但是我发布了一个关于如何在选择DataGridColumn时使用触发器的答案(意思是选择了列中的单元格) –

回答

0

假设您需要突出基础上选择\数据GID列标题突出细胞....

创建DataGrid范围的样式DataGridColumnHeader。在样式中包含一个数据触发器,用于检查列标题的内容和当前单元格的列标题的内容是否相等......这意味着列标题属于当前单元格所属的列。如果是这样,我们改变标题的背景颜色。

<toolkit:DataGrid x:Name="MyDataGrid" 
     IsReadOnly="True" 
     AutoGenerateColumns="False"> 
    <toolkit:DataGrid.Resources> 
    <local:EqualityConverter x:Key="EqualityConverter"/> 
    <Style TargetType="{x:Type toolkit:DataGridColumnHeader}"> 
     <Style.Triggers> 
     <DataTrigger Value="True"> 
      <DataTrigger.Binding> 
      <MultiBinding Converter="{StaticResource EqualityConverter}"> 
       <Binding Path="CurrentCell.Column.Header" 
        RelativeSource="{RelativeSource 
        AncestorType={x:Type toolkit:DataGrid}}"/> 
       <Binding Path="Content" 
        RelativeSource="{RelativeSource Self}"/> 
      </MultiBinding> 
      </DataTrigger.Binding> 
      <Setter Property="Background" Value="Red"/> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </toolkit:DataGrid.Resources> 
    <toolkit:DataGrid.Columns> 
    <toolkit:DataGridTextColumn Header="Key" 
      Binding="{Binding Key, Mode=OneWay}"></toolkit:DataGridTextColumn> 
    <toolkit:DataGridTextColumn Header="Value" 
      Binding="{Binding Value, Mode=OneWay}"></toolkit:DataGridTextColumn> 
    </toolkit:DataGrid.Columns> 
</toolkit:DataGrid> 

EqualityConverter只是来检查,如果绑定值相等多绑定器...

public class EqualityConverter : IMultiValueConverter 
{ 
    public object Convert(
      object[] values, 
      Type targetType, 
      object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     if (values != null) 
     { 
      for (var i = 1; i < values.Count(); i++) 
      { 
       if (values[i] == null || !values[i].Equals(values[i-1])) 
       { 
        return false; 
       } 
      } 

      return true; 
     } 

     return false; 
    } 

    public object[] ConvertBack(
      object value, 
      Type[] targetTypes, 
      object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

让我知道是否有帮助。

相关问题