2011-09-13 108 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(); 
    } 
} 

讓我知道是否有幫助。

相關問題