2010-05-12 18 views
13

Mi chiedevo se c'è comunque la possibilità di disabilitare la selezione di tutte le opzioni nell'angolo in alto di WPF DataGrid .... ciò sembra verificarsi solo quando aggiungo un UserControl a un fixeddocument in WPF.Seleziona tutto WPF DataGrid

Grazie in anticipo,

U.

+0

Non sono sicuro di disabilitarlo, ma ho scoperto che nascondere i RowHeaders lo nasconderà. (causando problemi per me perché voglio nascondere RowHeaders ma mostra il pulsante SelectAll) – Rachel

risposta

6

Dopo aver utilizzato Snoop per analizzare l'Albero visiva di un'applicazione di test ho messo insieme, mi si avvicinò con questa soluzione utilizzando l'evento DataGrid_Loaded):

private void TheGrid_Loaded(object sender, RoutedEventArgs e) { 
    var dataGrid = (DataGrid)sender; 
    var border = (Border)VisualTreeHelper.GetChild(dataGrid, 0); 
    var scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0); 
    var grid = (Grid)VisualTreeHelper.GetChild(scrollViewer, 0); 
    var button = (Button)VisualTreeHelper.GetChild(grid, 0); 
    button.IsEnabled = false; 
} 

Ci può essere una soluzione XAML più elegante, ma questo è quello che mi è venuto in mente per primo, e sembra funzionare abbastanza bene (ovviamente non sto facendo nessuna gestione delle eccezioni).

Nota: non ho giocato con disabilitazione/riattivazione di DataGrid per garantire che il pulsante di selezione tutto rimanga disattivato. Se non viene disabilitato, è possibile anche collegarsi all'evento DataGrid_IsEnabledChanged.

Spero che questo aiuti !!

+2

Questa è una soluzione non valida e molto vulnerabile alle modifiche nel costrutto xaml. Utilizzare il binding al comando come suggerito da Eben se si desidera disabilitare il pulsante o disabilitare la visualizzazione come suggerito da Varun se si desidera nascondere il pulsante. – TheRoadrunner

27

C'è una proprietà HeadersVisibility in DataGrid. Ha quattro valori: All, Column, , None.

Con HeadersVisibility = All, si otterrà il pulsante SelectAll.

Con HeadersVisibility = Column, otterrete solo colonne. Non il pulsante SelectAll o le intestazioni di riga per selezionare una riga completa.

Con HeadersVisibility = Row, otterrete solo le intestazioni di riga per selezionare l'intera riga. Non il pulsante o le colonne SelectAll.

Con HeadersVisibility = None, non otterrete nulla. Tutte le intestazioni saranno nascoste.

Spero che questo ti aiuti.

0

vorrei cambiare il Control Templat e di DataGrid. È necessario disabilitare questo pulsante all'interno del modello. Questo è DataGridControlTemplate:

<ControlTemplate TargetType="{x:Type DataGrid}"> 
        <Border BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          Background="{TemplateBinding Background}" 
          Padding="{TemplateBinding Padding}" 
          SnapsToDevicePixels="True"> 
         <ScrollViewer x:Name="DG_ScrollViewer" 
             Focusable="false"> 
          <ScrollViewer.Template> 
           <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
            <Grid> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="Auto" /> 
              <ColumnDefinition Width="*" /> 
              <ColumnDefinition Width="Auto" /> 
             </Grid.ColumnDefinitions> 
             <Grid.RowDefinitions> 
              <RowDefinition Height="Auto" /> 
              <RowDefinition Height="*" /> 
              <RowDefinition Height="Auto" /> 
             </Grid.RowDefinitions> 
             <Button Command="{x:Static DataGrid.SelectAllCommand}" 
               Focusable="false" 
               Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" 
               Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
               Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
             <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" 
                     Grid.Column="1" 
                     Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
             <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" 
                   CanContentScroll="{TemplateBinding CanContentScroll}" 
                   Grid.ColumnSpan="2" 
                   Grid.Row="1" /> 
             <ScrollBar x:Name="PART_VerticalScrollBar" 
                Grid.Column="2" 
                Maximum="{TemplateBinding ScrollableHeight}" 
                Orientation="Vertical" 
                Grid.Row="1" 
                Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" 
                Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                ViewportSize="{TemplateBinding ViewportHeight}" /> 
             <Grid Grid.Column="1" 
               Grid.Row="2"> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
               <ColumnDefinition Width="*" /> 
              </Grid.ColumnDefinitions> 
              <ScrollBar x:Name="PART_HorizontalScrollBar" 
                 Grid.Column="1" 
                 Maximum="{TemplateBinding ScrollableWidth}" 
                 Orientation="Horizontal" 
                 Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" 
                 Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                 ViewportSize="{TemplateBinding ViewportWidth}" /> 
             </Grid> 
            </Grid> 
           </ControlTemplate> 
          </ScrollViewer.Template> 
          <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
         </ScrollViewer> 
        </Border> 
       </ControlTemplate> 

disattivare il tasto manualmente e assegnare questo ControlTemplate al vostro DataGrid.