【问题标题】:Change background color of ColumnHeaderStyle based on selection in datagrid根据数据网格中的选择更改 ColumnHeaderStyle 的背景颜色
【发布时间】:2011-11-16 11:05:15
【问题描述】:

我想出了如何突出显示感兴趣的行。我可以获取我感兴趣的列的索引并使用 ScrollIntoView 跳转到它。但是,它不会立即向用户弹出。我想突出显示该列,或更改 ColumnHeaderStyle。我似乎无法弄清楚如何在 xaml 或后面的代码中做到这一点。

另一种选择是不突出显示整个行和列标题,而只突出感兴趣的单元格。我宁愿那样做,但想不通。

我当前的 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]);

    }

谢谢。

【问题讨论】:

  • Background 更改为DataGridColumnHeader 的工作量很大,因为您需要重新构建样式。不确定这是否是您想要的,但您是否尝试在 DataGrid 上设置 SelectionUnit="CellOrRowHeader"
  • @Meleak,我会为选定的列使用什么触发器?
  • 不确定我是否正确理解了您的问题,但我发布了关于如何在选择 DataGridColumn 时使用触发器的答案(意味着选择了列中的一个单元格)
  • 那我完全不明白你的问题。您的标题说根据DataGrid 中的选择更改ColumnHeaderStyle,而我的回答恰恰表明了这一点。也许上传一张图片显示你想要做什么。你想在你滚动到的单元格的中心做一个“红十字”吗?

标签: c# wpf


【解决方案1】:

假设您需要根据选定的 \ 突出显示的单元格突出显示数据 gid 列标题 ....

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

<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();
    }
}

如果有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多