Изменить цвет фона ColumnHeaderStyle на основе выделения в сетке данных - PullRequest
0 голосов
/ 13 сентября 2011

Я разобрался, как выделить интересующий ряд.Я могу получить индекс интересующего меня столбца и использовать 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]);

    }

спасибо.

1 Ответ

0 голосов
/ 14 сентября 2011

Предполагая, что вам нужно выделить заголовок столбца 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();
    }
}

Дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...