2011-09-13 41 views
0

目的の行を強調表示する方法を理解しました。興味のある列のインデックスを取得して、ScrollIntoViewを使用してジャンプすることができます。ただし、すぐにユーザーにポップアウトすることはありません。列を強調表示するか、ColumnHeaderStyleを変更します。 xamlやコードの背後でそれをどうやって行うのか分かりません。DataHeaderの選択に基づいてColumnHeaderStyleの背景色を変更します

もう1つの方法は、行全体と列ヘッダーを強調表示せず、関心のあるセルだけを強調表示することです。私はむしろそれをしたいと思いますが、それを理解できませんでした。背後

<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]); 

    } 

おかげ

私の現在のDataGridにはこのようになります。あなたが選択した\に基づいて、データGID列ヘッダは、セルを強調表示強調表示する必要があると仮定すると....

+0

'DataGridColumnHeader'の' Background'を変更するのは、スタイルを再構築する必要があるためです。これがあなたの望むものであるかどうかは不明ですが、 'DataGrid'に' SelectionUnit = "CellOrRowHeader" 'を設定しようとしましたか? –

+0

@Meleak、選択された列にどのトリガーを使用するのですか? – Crystal

+0

私はあなたの質問を正しく理解していませんでしたが、 'DataGridColumn'が選択されたときにトリガーを使用する方法についての回答を投稿しました。(列のセルが選択されていることを意味します) –

答えて

0

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

は、それが助け場合、私に教えてください...バウンド値が等しいかどうかをチェックするだけでマルチバインディングコンバーターです。

関連する問題